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

700 阅读3分钟

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

背景

项目中某需求需要调用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也是接受不到的。

舒服了,没有用的知识又掌握了一个,我是张诺然,间歇性踌躇满志的咸鱼。有问题欢迎私信交流