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有关,简单来说就是:前面的不调用就说明自己处理了,不用后面的操心啦,后面所有的都不会收到消息。






更多相关文章

  1. android事件分发(三)重要的函数requestDisallowInterceptTouchEven
  2. android Support Annotations(注解支持)
  3. 异步加载注意的事项
  4. Android9.0 SIM卡初始化---更新数据(代码 高通9.0代码)
  5. [置顶] Android输入法框架
  6. Android(安卓)WMS分析(一) WindowManager
  7. Android开发中调用Spring CXF整合发布的WebService接口为什么抛
  8. Android(安卓)开发笔记 第三季 FragmentPagerAdapter
  9. 如何在代码里打开Android手机通知状态栏

随机推荐

  1. kotlin 开发 android 程序中网络http请求
  2. 【Android】android 输入框EditText禁止
  3. android Draw Rect 坐标图示
  4. android极简原创系列:最简单的listview数
  5. AndroidManifest.xml文件详解(supports-sc
  6. android手机文件后缀揭秘
  7. Android平台开发-3G function porting-3G
  8. 6 android 滑块和进度条
  9. Android在View中的动画
  10. Android 底部导航BottomNavigationView(非