Android Activity切换与Activity间数据交互

在Android程序内部, startActivity借助Intent来启动一个子Activity(使用父子关系进行表述,只为表达清晰,Android中并未有父子Activity的概念)。如下:

Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
说明:
1、LoginActivity.this 指明了Intent的上下文
2、MainActivity.class 指明了要启动的子Activity的class
3、Intent除了可以启动Activity外,还可用来启动Service、其他APP等
4、startActivity(intent)在执行后,当前Activity将被子Activity覆盖进入暂停状态;当子Activity被关闭时,之前被覆盖的父Activity恢复继续执行。 在父子Activity交替之际(启动子Activity时或父Activity恢复运行时),Android允许两个Activity之间进行数据交互。
1、给新启动的子Activity传递数据
如果给新启动的子Activity传递数据,只需要在Intent对象中加入key-value,key为准备传递数据的字符指示名称,value为准备传递的数据
intent.putExtra(“KEY",data);
startActivity(intent);

在子Activity中获取传递来的数据,如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DataType data= (DataType)getIntent().getDataTypeExtra(”KEY");
}

说明:

1、在onCreate中调用

2、DataType用你需要的数据类型替换

------------------------------------------------------------------------------------------------------------------------------------------

2、从子的Activity中返回数据

如果要在子Activity中返回数据,只需要在子Activity结束前通过Intent对象中加入key-value,如下:

Intent intent = new Intent();
intent.putExtra(“KEY”, data);
setResult(RESULT_OK, intent);
this.finish();

说明:

1、setResult(RESULT_OK, intent) 设置子Activity要返回父Activity(打开新Activity的Activity)的信息,RESULT_OK为int值,表子Activity成功执行完毕,intent里面就是包含要返回的数据。

2、记得要关闭哦 finish()在父Activity中如果要接收子Activity的返回结果,需要使用 startActivityForResult(intent, requestCode)打开子Activity,并且要重写 onActivityResult方法

打开子Activity并期待返回结果的代码如下:

............
Intent intent = new Intent(this, DrugLibActivity.class);
startActivityForResult(intent, 10);
............
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (10 == requestCode) {
int index = data.getIntExtra(KEY,0);
}
}

说明:

1、startActivityForResult 中 requestCode应该为>=0的数值(建议用常量替代更直观)

2、onActivityResult(int requestCode, int resultCode, Intent data)在子Activtiy关闭后,requestCode为启动子Activity时的requestCode值,resultCode为子Activity setResult中设置的值。

3、如果在同一个Activity中有多个地方可调用 startActivityForResult 打开多个子 Activity 的情况,那你应该在 onActivityResult 返回时判断 requestCode,这样你就能搞清楚是哪个子Activity返回了数据。

4、如果在 AndroidManifest.xml 中,你准备打开并接受返回值的子Activity 被设置为 android:launchMode="singleTask"。那很遗憾告诉你,当 startActivityForResult 调用后onActivityResult 会马上执行,而此时子窗体还未返回。

为什么会这样呢?这首先需要我们搞清楚什么是launchMode="singleTask"。

上一篇:Android -- 两个activity界面的切换, 显示Intent 和 隐式Intent,putExtra传递数据


下一篇:Android进阶之Fragment与Activity之间的数据交互