Activity的页面跳转有两种,一种是有返回数据的,一种是没有返回数据的。
①没有返回数据的跳转:
我们从Activity A中使用startActivity(intent)启动了Activity B,然后调用finish()结束Activity B返回Activity A。
A可以传递数据给B,但是B不能传递数据给A。
先上代码
noResultButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.setClass(MainActivity.this, NextActivity.class); //上面两句和Intent intent = new Intent(MainActivity.this, NextActivity.class)等价 //intent.putExtra("key", "无返回值的跳转");//也可以用Bundle存放数据 Bundle bundle = new Bundle(); bundle.putString("key", "无返回值的跳转"); intent.putExtras(bundle);//注意putExtras()和putExtra()的区别 startActivity(intent);//跳转页面 } });
这样intent就带着一个Bundle数据包从A到达了B,现在我们要在B里面把Bundle数据包解开
String msg = getIntent().getStringExtra("key"); getText.setText(msg);通过getIntent方法获得Intent对象,然后通过键值key获得数据。
这样就完成了第一种跳转,无返回值的跳转。
②有返回数据的跳转:
我们从Activity A中使用startActivityForResult(intent, requestCode)启动了Activity B,然后调用setResult()设置返回值,
再用finish()结束Activity B返回Activity A,A会调用onActivityResult()方法获得B回传的数据
A可以传递数据给B,但是B也能回传数据给A。
先上代码,在Activity A中
hasResultButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.setClass(MainActivity.this, NextActivity.class); intent.putExtra("key", "有返回值的跳转");//带着键值为key的数据包跳转 startActivityForResult(intent, 1);//注意这里的1,代表的是请求方的标志 } });
startActivityForResult(Intent intent, int requestCode)这个方法中,intent和第一种用法相同,传递的是数据包。
但是后面多了个requestCode,意思是请求的标志,就好像是邮政编码一样,用来检测是谁发送出去的数据包。
之后会解释requestCode的用法。
那么B获得了A的数据包,想要返回一个值,比如“我收到你的邮件了!”,在Activity B中
returnButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.putExtra("key", "获得第二个Activity传来的数据");//想要返回给A的数据 setResult(2, intent);//注意这里的2,代表的是返回方的标志 finish();//结束Activity B } });这里的setResult( int resultCode, Intent intent)这个方法中,intent不用再说了吧,传递的是数据包。
而resultCode,这个和requestCode不同,是返回方的标志,就好像B收到了A的邮件,要告诉A我收到了!
也是像邮政编码一样,不过这次表示的是收件方,用来检测是谁返回的数据包。
之后会解释resultCode的用法。
返回去之后,我们再来看Activity A,Activity中有一个方法onActivityResult(int requestCode, int resultCode, Intent data)
看到是不是很熟悉?里面有我们之前没解释完的requestCode和resultCode
还是上代码说话,在Activity A中
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 1 && resultCode == 2) { resultText.setText(data.getStringExtra("key")); } }
看到1和2是不是很熟悉?就是检测是不是A发出去,B返回来。
试想如果A中有100个button发出去,然后B中有200个Button返回来,100*200=20000种结果。
我们就是通过requestCode和resultCode来辨别是谁发出去,谁返回来的,产生多种结果。