本文已参与「新人创作礼」活动,一起开启掘金创作之路。
背景
项目中某需求需要调用startActivityForResult,但是关于requestCode设置为多少,我犹豫了一段时间,原因如下:
- 项目中并无明确requestCode相关文档和规定
- 当前requestCode比较乱,下至1,上至2000+均有定义
于是我就产生了一个问题,requestCode如果定义重复了会发生什么,是否会导致多个activity同时在onActivityResult中触发呢?
寻求真理的过程
找大神博客
关于requestCode的定义的博客很少,找到了一篇博客的结论是:所有栈内的onActivityResult均会调用,然后根据requestCode和resultCode来进行业务区分。
感觉说的有点道理。但是还是有一些不确认
找同事讨论
与经理茶余饭间的时候讨论了一下这个问题,经理的结论是谁startActivityForResult才会触发对应的onActivityResult,如A启动B,requestCode为1,B启动C,requestCode同样为1,C中setResult然后finish,返回B的过程中,只有B会接收到onActivityResult的信号,A不会。
实践出真知
根据与同事讨论的例子,写了一个demo。(demo很简单,就不贴代码了)
- 测试涉及到的类:MainActivity,FirstActivity,SecondActivity
- 测试步骤
- MainActivity通过startActivityForResult启动FirstActivity,requestCode为1;
- FirstActivity通过startActivityForResult启动SecondActivity,requestCode为1;
- MainActivity和FirstActivity中均在onActivityResult中打印触发时的requestCode和resultCode
- SecondActivity中setResult,resultCode为1,并finish()。
- 观察MainActivity和FirstActivity何时能接受到返回的信号触发onActivityResult。
- 测试结果:
- 注:resultCode为0是Activity.RESULT_CANCELED的值,从名字上也可以看出来,他表示的是返回结果被取消了。
- SecondActivity点击按钮setResult之后finish。
2020-09-22 10:51:35.311 20713-20713/com.example.myapplication D/zjj: FirstActivity requestCode:1, resultCode:1
- SecondActivity直接点击返回按钮返回,不进行setResult
2020-09-22 10:52:27.076 20713-20713/com.example.myapplication D/zjj: FirstActivity requestCode:1, resultCode:0
- 从FirstActivity界面点击按钮返回到MainActivity 2020-09-22 10:53:29.401 20713-20713/com.example.myapplication D/zjj: MainActivity requestCode:1, resultCode:0
- 结论 仅从当前现象来看,同事应该说对了,即startActivityForResult之后的requestCode仅仅能由启动它的Activity触发,即A通过startActivityForResult启动B之后,B的setResult仅仅能由A接受。
那么问题又来了,MainActivity接收到的到底是启动FirstActivity的requestCode还是SecondActivity的requestCode呢?其实应该就是FirstActivity的requestCode,但是我们再确认一下,
- MainActivity启动FirstActivity的时候直接通过startActivity取代startActivityForResult,看MainActivity还能否触发onActivityResult。
- 结论:不管是从SecondActivity返回还是FirstActivity返回,均未触发MainActivity的onActivityResult回调。
从源码一探究竟
这个后续不定期补充
结论
- startActivityForResult影响的只是调用startActivityForResult和待启动的Activity,形象点表达就是
ActivityA.startActivityForResult(new Intent(ActivityA.this, ActivityB.class), 1);
requestCode为1,只能由ActivityA中的onActivityResult接收到,即使ActivityA是ActivityC通过相同的requestCode启动的,ActivityC也是接受不到的。
舒服了,没有用的知识又掌握了一个,我是张诺然,间歇性踌躇满志的咸鱼。有问题欢迎私信交流
今天的文章【Android】没用的知识点系列-startActivityForResult分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/16476.html