Android面试(13): Android 中返回数据给上一个活动---startActivityForResult() 方法的使用详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yz_cfm/article/details/85764664

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);
}

猜你喜欢

转载自blog.csdn.net/yz_cfm/article/details/85764664