1 概述
Activity
之间的跳转主要使用
startActivity(Intent intent);
startActivityForResult(Intent intent,int requestCode);
这两个函数,传递数据的话利用Intent
进行传递,负责数据需要配合Bundle
使用。这篇文章讲述了如何利用这两个函数在Activity
之间的跳转以及传递数据。
2 Activity
间跳转
2.1 直接跳转
这里有两个Activity
:FirstActivity
与SecondActivity
,从FirstActivity
中跳转到SecondActivity
中只需要一个startActivity()
即可:
startActivity(new Intent(this,SecondActivity.class));
一般需要在SecondActivity
中加上finish()
函数,表示这个Activity
结束,比如这里直接在SecondActivity
的按钮事件里面加上了finish()
:
2.2 回调
很多情况下需要在FirstActivity
跳转到SecondActivity
后,在SecondActivity
进行相应的操作,如更新数据之类,然后返回FirstActivity
,通知FirstActivity
执行某些操作,这时候就需要使用startActivityForResult()
。
startActivityForResult
有两个参数,一个是Intent
,表示将要跳转的Activity
,一个是requestCode
,表示请求码,用于调用Activity
的onActivityResult()
函数。
如FirstActivity
中:
startActivityForResult(new Intent(this,SecondActivity.class),11);
这里11就是请求码,然后在SecondActivity
中,使用setResult()
函数:
setResult(22,new Intent().putExtra("str","from second activity"));
setResult()
接受两个参数,第一个参数表示resultCode
,从这个SecondActivity
返回的结果码,另一个Intent
,表示要返回给FirstActivity
的数据。
最后在FirstActivity
中重载onActivityResult()
:
onActivityResult
中判断请求码与结果码后进行相应操作。
3 Activity
间传递数据
3.1 传递普通数据
传递普通类型的数据直接使用Intent
的putExtra()
即可,putExtra
接受两个参数,第一个是一个String
,表示键,第二个是值,类型可以是byte
、char
、short
、long
等基本类型与这些基本类型组成的数组,当然String
也可以。
比如在FirstActivity
中,传递数据给SecondActivity
:
然后在SecondActivity
中使用getIntent()
获取Intent
后,再从里面获取数据:
如果想从SecondActivity
中返回数据给FirstActivity
,也就是从被调用的Activity
中返回数据,可以使用前面介绍过的setResult()
方法。
其中第二个参数是一个用于存储数据的Intent
,把数据put
进去即可。
最后记得在onActivityResult
做相应的判断处理:
3.2 传递一组数据
当数据的种类变多时,比如混合了int
、String
、byte
、char
等,可以对逐个类型使用putExtra()
,但更好的方法是使用Bundle
。
Bundle
的使用与Intent
类似,也是对于不同的类型采用键值对的添加方法,直接putXXX:
数据添加完毕之后,在intent
中使用putExtras(bundle)
:
然后就可以在SecondActivity
中接收数据了。
首先需要使用getIntent().getExtras()
获取Bundle
,再获取里面的数据。
注意一下获取到的Bundle
有可能为null
,取数据前需要判断一下。
3.3 传递对象
如果想要传递的数据是一个对象怎么办?难道对每一个属性都使用getter再放进去吗?
并不是,Bundle
提供了一个处理序列化对象的方法:
只要对象实现了Serializable
,就可以被Bundle
处理,比如这里有一个测试类Student
:
然后在FirstActivity
中直接new
一个,并使用Bundle
的putSerializable
即可。
接着再SecondActivity
中通过Intent
取出Bundle
后,使用其中的getSerializable()
取出对象,最后使用强制类型转换: