Android面试(13): Android(安卓)中返回数据给上一个活动---startActivityForResult() 方法的使用详解
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);}
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- [Android]Fragment自定义动画、动画监听以及兼容性包使用
- Android(安卓)home键和back键区别
- Android数据存储之SQLite
- Android(安卓)Hook 机制之实战模拟
- 【Android】Handler应用(一):从服务器端加载JSON数据
- Android开发学习之路--Content Provider之初体验