在上一小节中Intent的简介和显式隐式跳转,通过使用startActivity(Intent)方法启动Activity后,启动后的两个Activity之间相互独立,没有任何的关联。
本次学习两个Activity之间的数据传递的问题。通常的情况下,都会有多个Activity的跳转组成一整套的系统,而这些跳转承接关系的Activity之间,需要进行数据的传递。这就是使用Intent通信来实现数据的传递了。
在很多情况下,后启动的Activity是为了让用户对特定信息进行选择,在关闭这个Activity后,用户的选择信息需要返回给未关闭的那个Activity。按照Activity启动的先后顺序,先启动的称为父Activity,后启动的称为子Activity。如果需要将子Activity的部分信息返回给父Activity,则可以使用Sub-Activity的方式去启动子Activity,获取Activity返回值。
获取子Activity的返回值,一般可以分为以下三个步骤
- 以Sub-Activity的方式启动子Activity——父
- 设置子Activity的返回值——子
- 在父Activity中获取返回值——父
以Sub-Activity的方式启动子Activity
- 调用startActivityForResult(Intent, requestCode)函数
- 参数Intent用于决定启动哪个Activity
- 参数requestCode是唯一的标识子Activity的请求码
1、显式启动子Activity的代码如下
int SUBACTIVITY1 = 1;//在子Activity中设置不同的值
Intent intent = new Intent(this, SubActivity1.class);
startActivityForResult(intent, SUBACTIVITY1);
2、隐式启动子Activity的代码如下
int SUBACTIVITY2 = 2;
Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, SUBACTIVITY2);
设置子Activity的返回值
- 在子Activity调用finish()函数关闭前,调用setResult()函数将所需的数据返回给父Activity
- setResult()函数有两个参数 结果码 和 返回值
结果码表明了子Activity的返回状态,通常为Activity.RESULT_OK或者Activity.RESULT_CANCELED,或自定义的结果码,结果码均为整数类型
返回值用封装在Intent中,子Activity通过Intent将需要返回的数据传递给父Activity。数据主要是Uri形式,可以附加一些额外信息,这些额外信息用Extra的集合表示
下面代码说明如何在子Activity中设置返回值:
Uri data = Uri.parse("tel:" + tel_number);
Intent result = new Intent(null, data);
result.putExtra("address", " ");
setResult(RESULT_OK, result);
finish();
在父Activity中获取返回值
- 当子Activity关闭时,启动它的父Activity的onActivityResult()函数将被调用;如果需要在父Activity中处理子Activity的返回值,则重载此函数即可
此函数的语法如下
public void onActivityResult(int requestCode, int resultCode, Intent data);
第1个参数requestCode,用来表示是哪一个子Activity的返回值
第2个参数resultCode用于表示子Activity的返回状态
第3个参数data是子Activity的返回数据,返回数据类型是Intent。根据返回数据的用途不同,Uri数据的协议则不同,也可以使用Extra方法返回一些原始类型的数据