【Android】没用的知识点系列-startActivityForResult

【Android】没用的知识点系列-startActivityForResult不知道大家有没有这个疑问,如果android中多个activity设置了相同的requestcode,那如果返回到其他的activity中,其他的onActivityResult方法会触发吗

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

背景

项目中某需求需要调用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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注