startActivityForResult() 方法的作用就是返回数据给上一个活动。
这里我们通过两种情况来说明:
1. 从 Activity A 启动 Activity B 后,Activity B 销毁时返回数据给 Activity A。
2. 现在假设 Fragment C 依附于 Activity A,Fragment D 依附于 Activity B,然后 C 通过启动 B 然后打开 D,D 销毁时返回数据给 C。
这两种情况其实就是我们项目中使用的界面跳转方式,之所以分开来说,是因为在 Fragment 中和在 Activity 中通过startActivityForResult() 启动另一个界面传回来的结果处理有些细微的差别需要注意,详情如下。
首先我们先详细说明一下我们要用到的三个方法:
①public void startActivityForResult (Intent intent, int requestCode);
②public void onActivityResult (int requestCode, int resultCode, Intent data);
③public final void setResult (int resultCode, Intent data);
其中 ①和② 在 Activity 中和 Fragment 中都有,方法③只有 Activity 中有,Fragment 中没有这个方法。
参数解析:
Intent intent: 这个就不用多说了,通过 intent 传递数据。
int requestCode: 请求代码。用于表示启动的活动标识符,唯一就可以,这样在接收传回来的数据时,我们就可以通过它知道是哪一个活动传回来的。
int resultCode: 结果代码。 一般为 RESULT_CANCELED 或者 RESULT_OK,返回结果标识。
使用方法:
情况一、从 Activity A 启动 Activity B 后,Activity B 销毁时返回数据给 Activity A :
ActivityA.java 中重写 onActivityResult() 方法:
// 通过 startActivityForResult() 启动 ActivityB
Intent intent = new Intent(ActivityA.class, ActivityB.class);
startActivityForResult(intent, 1); // 这里请求码唯一就可以,我这里是 1
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch( requestCode ){
case 1:
if( resultCode == RESULT_OK ){
String returnedData = data.getStringExtra(" data_return ");
}
break;
default:
break;
}
}
ActivityB.java 通过 setResult() 方法返回数据:
Intent intent = new Intent();
intent.putExtra("data_return", " Hello ActivityA ");
setResult(RESULT_OK, intent);
情况二、现在假设 Fragment C 依附于 Activity A,Fragment D 依附于 Activity B,然后 C 通过启动 B 然后打开 D,D 销毁时返回数据给 C:
和情况一类似,我们在 Fragment C 中调用 Fragment 中的 startActivityForResult() 和 onActivityResult() 方法,一定注意这里调用的是 Fragment 自己的两种方法而不是 Activity 的。( 代码和情况一种 Activity A 中的一样)。
这里我们需要注意的一点就是,fragment 能够从 Activity 中接收返回结果,但其自身无法持有返回结果。因此,尽管 Fragment 有自己的 startActivityForResult() 和 onActivityResult() 方法,但没有 setResult() 方法。如果我们要向从 D 中返回数据给 A,那么就只能通过 D 依附的 Activity B 中的 setResult() 方法,代码如下:
FragmentD.java:
public void returnResult() {
Intent intent = new Intent();
intent.putExtra("data_return", " Hello FragmentC");
getActivity.setResult(Activity.RESULT_OK, intent);
}