一个界面跳转到另一个界面,这就Activity的跳转。我们在开发中常见的跳转有三种。普通跳转、有返回值的跳转、透传跳转。我们先来看一种。
1 . Activity的普通跳转(传值跳转)
这个跳转是最简单的
Intent intent=new Intent();
intent.setClass(this, OtherActivity.class);
intent.setClassName(this, "com.zy.MutiActivity.OtherActivity"); //方法3 此方式可用于打开其它的应用
intent.setComponent(new ComponentName(this, OtherActivity.class)); //方法4
intent.putXXX("key" , value);//传值
startActivity(intent2); //只用Activity的这个方法,因为与有返回值的跳转使用的跳转的方法是不一样的。
2 . Activity有返回值得跳转
先看代码:
发起请求的界面
public class SecondActivity extends Activity { private Button but ,but1 ; private TextView textView ; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( R.layout.secondlayout); but = (Button) findViewById( R.id.but2); but1 = (Button) findViewById( R.id.but22); textView = (TextView) findViewById( R.id.text); but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass( SecondActivity.this , ThirdActivity.class); startActivityForResult(intent , 1 ); //第二参数为请求码,代表是从这个界面跳转的。 } }); but1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); System.out.println(" =======> onCreate"); } @Override protected void onStart() { super.onStart(); System.out.println(" =======> onStart"); } @Override protected void onResume() { super.onResume(); System.out.println(" =======> onResume"); } @Override protected void onPause() { super.onPause(); System.out.println(" =======> onPause"); } @Override protected void onStop() { super.onStop(); System.out.println(" =======> onStop"); } @Override protected void onDestroy() { super.onDestroy(); System.out.println(" =======> onDestroy"); } @Override protected void onRestart() { super.onRestart(); System.out.println(" =======> onRestart"); } /** * 这个方法用来接收返回值 * @param requestCode 请求码,当requestCode与上面跳转时传的请求码一样时,说明是这个界面的请求 * @param resultCode 结果码(是否成功) * @param data 返回来的数据保存在这里面 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); System.out.println("===========> onActivityResult"); if(requestCode == 1 ){ if(resultCode == Activity.RESULT_OK){ textView.setText(data.getStringExtra("key")); } } } }返回结果的界面 代码:
public class ThirdActivity extends Activity{ private Button but , but1 ; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( R.layout.thirdlayout); but = (Button) findViewById( R.id.but3); but1 = (Button) findViewById( R.id.but33); but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass( ThirdActivity.this , MainActivity.class); startActivity( intent ); } }); but1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("key" , "有返回值的跳转"); setResult(Activity.RESULT_OK ,intent ); //Activity.RESULT_OK结果码,OK为成功 , intent保存数据 finish(); } }); } }看结果:
图是有点丑了,但能说明效果就可以了。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); System.out.println("===========> onActivityResult"); if(requestCode == 1 ){ if(resultCode == Activity.RESULT_OK){ textView.setText(data.getStringExtra("key")); } } }方法的解析
requestCode : 这个值是通过startActivityResult( )方法传递过去的Requstcode的请求码,传递过去的是多少这个值就是多少。那么不要这个值是否可以?设想一下,假如ActivityA 界面有两个操作,一个操作是从AcitivityB获取返回的结果,另外一个操作是从ActivityC获取操作,而我们不重写onActivityResult方方法接受返回值,那么如何区分是哪个界面的返回值呢?这个时候就需要判断requestCode值,requestCode 这个值是通过startActivityResult( )方法原封不动的传递过去的,所以我们可以定义一个从B跳转的requestCode 值(假设为 1 ) ,设B的跳转requestCode 值(假设为 2 )。我们就可以在A界面的onActivityResult()方法中根据requestCode值来判断只从那个界面返回的值了,然后做不同的逻辑处理。
resultCode :结果的状态,这个值分别为Activity.CANCE , Activtity.RESULT_OK:OK代表返回值正常,这个时候我们就可以处理结果,如果为canse说明异常这个时候获取不到数据。
data : 返回的数据就保存在这个里面,从这个里面获取数据。
05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out: ===========> onActivityResult
05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out: =======> onRestart
05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out: =======> onStart
05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out: =======> onResume
说明onActivityResult()再onRestart()的前面执行。需要注意
2 . Activity的透传跳转。
看代码:
MainActivity
public class MainActivity extends FragmentActivity { private boolean tager = false; private EditText keyET; private EditText valueET; private Button insertBtn; private Button deleteBtn; private Button modifyBtn; private Button queryBtn; private Button clearBtn; private Button startActivity ; private TextView textView; /** 存储的文件名 */ public static final String DATABASE = "Database"; /** 存储后的文件路径:/data/data//shares_prefs + 文件名.xml */ public static final String PATH = "/data/data/code.sharedpreferences/shared_prefs/Database.xml"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); keyET = (EditText) findViewById(R.id.key); valueET = (EditText) findViewById(R.id.value); insertBtn = (Button) findViewById(R.id.insert); deleteBtn = (Button) findViewById(R.id.delete); modifyBtn = (Button) findViewById(R.id.modify); queryBtn = (Button) findViewById(R.id.query); clearBtn = (Button) findViewById(R.id.clear); startActivity = (Button) findViewById( R.id.but1); // 用于显示存储文件中数据 textView = (TextView) findViewById(R.id.content); insertBtn.setOnClickListener(new OperateOnClickListener()); deleteBtn.setOnClickListener(new OperateOnClickListener()); modifyBtn.setOnClickListener(new OperateOnClickListener()); queryBtn.setOnClickListener(new OperateOnClickListener()); clearBtn.setOnClickListener(new OperateOnClickListener()); startActivity.setOnClickListener( new OperateOnClickListener()); } class OperateOnClickListener implements View.OnClickListener { @Override public void onClick(View v) { // 获取SharedPreferences对象 SharedPreferences sp = getSharedPreferences(DATABASE, Activity.MODE_PRIVATE); // 获取Editor对象 SharedPreferences.Editor editor = sp.edit(); // 获取界面中的信息 String key = keyET.getText().toString(); String value = valueET.getText().toString(); switch (v.getId()) { // 插入数据 case R.id.insert: if(!tager) { editor.putString("1", "123"); editor.commit(); tager = true; }else{ editor.putInt("1", 456); editor.commit(); tager = false; } textView.setText(MainActivity.this.print()); break; // 删除数据 case R.id.delete: //editor.remove(key); int value1 = Integer.valueOf(value); editor.putInt(key, value1); editor.commit(); textView.setText(MainActivity.this.print()); break; // 修改数据 case R.id.modify: editor.putString(key, value); editor.commit(); textView.setText(MainActivity.this.print()); break; // 查询数据 case R.id.query: String result = sp.getString(key, ""); textView.setText("key=" + key + ",value=" + result); break; // 清空所有数据 case R.id.clear: editor.clear(); editor.commit(); textView.setText(MainActivity.this.print()); break; case R.id.but1: Intent intent = new Intent(); intent.setClass( MainActivity.this , SecondActivity.class); startActivityForResult(intent , 100); break; } } } /** 获取存储文件的数据 */ private String print() { StringBuffer buff = new StringBuffer(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(PATH))); String str; while ((str = reader.readLine()) != null) { buff.append(str + "/n"); } } catch (Exception e) { e.printStackTrace(); } return buff.toString(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 100 && resultCode == Activity.RESULT_OK){ textView.setText(data.getStringExtra("key")); } } }
SencedActivity
public class SecondActivity extends Activity { private Button but ,but1 ; private TextView textView ; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( R.layout.secondlayout); but = (Button) findViewById( R.id.but2); but1 = (Button) findViewById( R.id.but22); textView = (TextView) findViewById( R.id.text); but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass( SecondActivity.this , ThirdActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); startActivity( intent ); finish(); } }); but1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); System.out.println(" =======> onCreate"); } @Override protected void onStart() { super.onStart(); System.out.println(" =======> onStart"); } @Override protected void onResume() { super.onResume(); System.out.println(" =======> onResume"); } @Override protected void onPause() { super.onPause(); System.out.println(" =======> onPause"); } @Override protected void onStop() { super.onStop(); System.out.println(" =======> onStop"); } @Override protected void onDestroy() { super.onDestroy(); System.out.println(" =======> onDestroy"); } @Override protected void onRestart() { super.onRestart(); System.out.println(" =======> onRestart"); } }
ThirdActivity
public class ThirdActivity extends Activity{ private Button but , but1 ; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( R.layout.thirdlayout); but = (Button) findViewById( R.id.but3); but1 = (Button) findViewById( R.id.but33); but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass( ThirdActivity.this , MainActivity.class); startActivity( intent ); } }); but1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("key" , "有返回值的跳转"); setResult(Activity.RESULT_OK ,intent ); //Activity.RESULT_OK结果码,OK为成功 , intent保存数据 finish(); } }); } }
关键在SecondActivtiy 跳转时,Intnet设置Flag标志
看结果: