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() 启动 ActivityBIntent intent = new Intent(ActivityA.class, ActivityB.class);startActivityForResult(intent, 1); // 这里请求码唯一就可以,我这里是 1@Overrideprotected 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);}

 

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. [Android]Fragment自定义动画、动画监听以及兼容性包使用
  5. Android(安卓)home键和back键区别
  6. Android数据存储之SQLite
  7. Android(安卓)Hook 机制之实战模拟
  8. 【Android】Handler应用(一):从服务器端加载JSON数据
  9. Android开发学习之路--Content Provider之初体验

随机推荐

  1. Android数字签名解析(二)
  2. 【读书笔记】【Android(安卓)开发艺术探
  3. android 对listview数据的增删改查
  4. Android(安卓)webView 缓存 Cache + HTML
  5. Android微信右上角弹出的对话选择框实现
  6. Android软件发布--数字签名与优化
  7. Android开发周报:罗永浩激辩王自如
  8. 解决 :android studio 提交代码到git/gith
  9. [置顶] 自己开发的Android(安卓)软件发布
  10. Android与webservice进行实体对象的传递