Android中onActivityResult方法总结
onActivityResult是一个存在于Activity和Fragment中的回调方法,需要配合startActivityForResult方法,来实现主界面与子功能模块的数据交互。
实际使用的情景主要分为一下几种:
1)在Activity中发起startActivityForResult
假设当前Activity为A,A中调用如下的startActivityForResult方法来启动B
Intent intent = new Intent(A.this, B.class);
startActivityForResult(intent, 10);
则从B回到A时会触发A中的onActivityResult回调方法,此时的requestCode的值为发起时的10;
2)在Fragment中发起startActivityForResult
假设当前Fragment为C,C的宿主Activity为A,从C中调用startActivityForResult方法来启动B
当C使用宿主activity的startActivityForResult时
Intent intent = new Intent(getActivity(), B.class);
getActivity().startActivityForResult(intent, 10);
则从B回到C/A时,结果跟情况1)类似,只有A中的onActivityResult方法会被触发,的requestCode的值为发起时的10,C中的onActivityResult不会被触发。
当C使用fragment自有的startActivityForResult时
Intent intent = new Intent(getActivity(), B.class);
startActivityForResult(intent, 10);
则从B回到C/A时,如果A中重写了onActivityResult方法,会首先触发A中的onActivityResult回调方法,但requestCode为一个随机数,此时,如果A中的onActivityResult方法中调用了super.onActivityResult,则会继续触发C中的onActivityResult方法,且requestCode值为发起时的10;若A中的onActivityResult未调用super.onActivityResult,则C中的onActivityResult方法无法被触发。
3)在子Fragment中发起startActivityForResult
假设当前Fragment为D,D的父Fragment是C,C的宿主Activity是A
当D使用宿主activity的startActivityForResult时
Intent intent = new Intent(getActivity(), B.class);
getActivity().startActivityForResult(intent, 10);
则从B回到D/C/A时,结果跟情况1)类似,只有A中的onActivityResult方法会被触发,的requestCode的值为发起时的10,C中的onActivityResult不会被触发。
当D使用父fragment的startActivityForResult时
Intent intent = new Intent(getActivity(), B.class);
getParentFragment().startActivityForResult(intent, 10);
则从B回到D/C/A时,如果A中重写了onActivityResult方法,会首先触发A中的onActivityResult回调方法,但requestCode为一个随机数,此时,如果A中的onActivityResult方法中调用了super.onActivityResult,则会继续触发C中的onActivityResult方法,且requestCode值为随机数;D中的onActivityResult方法无法被触发。
当D使用fragment自有的startActivityForResult时
Intent intent = new Intent(getActivity(), B.class);
startActivityForResult(intent, 10)
则从B回到D/C/A时,如果A中重写了onActivityResult方法,会首先触发A中的onActivityResult回调方法,但requestCode为一个随机数,此时,如果A中的onActivityResult方法中调用了super.onActivityResult,则会继续触发C中的onActivityResult方法,且requestCode值为随机数;若C中的onActivityResult调用super.onActivityResult,则会继续触发D中的onActivityResult方法,且requestCode 值为发起时的10。
ps:总结的有点啰嗦,fragment中的onActivityResult是否会触发,除了跟使用哪个对象的startActivityForResult有关,还跟上层的onActivityResult方法是否调用super.onActivityResult有关,简单来说就是:前面的不调用就说明自己处理了,不用后面的操心啦,后面所有的都不会收到消息。
更多相关文章
- android事件分发(三)重要的函数requestDisallowInterceptTouchEven
- android Support Annotations(注解支持)
- 异步加载注意的事项
- Android9.0 SIM卡初始化---更新数据(代码 高通9.0代码)
- [置顶] Android输入法框架
- Android(安卓)WMS分析(一) WindowManager
- Android开发中调用Spring CXF整合发布的WebService接口为什么抛
- Android(安卓)开发笔记 第三季 FragmentPagerAdapter
- 如何在代码里打开Android手机通知状态栏