近期在写项目时,在使用startActivityForResult时遇到一些问题,虽然以前也有遇到过,由于时间比较久了,就忘记了。这次开始写博客,又恰逢遇到问题重现,就此写下短篇的记录短文。
先就现在比较常用的FragmengActivity的startActivityForResult源码进行解读:
先查看FragmengActivity的startActivityForResult源码
1 | /** |
通过mStartedActivityFromFragment判断我们的startActivityForResult方法是否从Fragment发起的。如果不是,则需要对requestCode进行检验,至于这里为何要对requestCode检验,我们后面再解释。我们跟着方法进入FragmengtActivity中的父类方法中
1 | public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, |
具体这里就不往下分析了,继续深入涉及ActivityManager以及ActivityThread的流程。有兴趣可自行查看。
这里说下我们经常遇到的一些问题,在一些APP上,我们需要用到startActivityForResult,来获取某个界面的数据。
现在Android大部分Activity开发基本都是使用FragmentActivity,内部嵌套多个Fragment。这时使用会遇到一些问题,如:
1、 在当前Fragment的onActivityResult的方法未调用,导致无法完成数据获取。
2、 在当前Activity中获取到的requestCode与发起的requestCode不一致。
等。
说下问题1:
当我们在Activity中或者Fragment中通过调用getActivity().startActivityForResult启动下一个activity时,当在activity setResult并调用finish时,回到调用的Activity我们去看下FragmentActivity的源码
1 | /** |
在此方法中可以看到进入方法后,会对requestCode进行处理,使用过的都知道requestCode的值是有限制的。
此处对requestCode进行右移操作,最终获取的requestCode在正常范围内都是趋于零,导致不会进入条件内,也不会进入Fragment的onActivityResult,若此时需要对fragment的进行回调,则需要自己在代码自行添加。
问题2,进过排查,发现在通过调用fragment的startActivityForResult,在FragmentActivity处获取到的requestCode与发出的requestCode不一致,并且有点随机数,不过该随机数都很大。具体还没详细查阅源码。而且会进入Fragment的onActivityResult,并不会出现问题1的情况。