这可能是个坑 2018-04-18 02:11 采纳率: 100%
浏览 1326
已采纳

以FLAG_ACTIVITY_REORDER_TO_FRONT启动Activity

有四个Activity A,B,C,D
A启动B使用startActivityForResult方式,启动intent的Flag配置为FLAG_ACTIVITY_REORDER_TO_FRONT。
然后B启动C,C启动D,都使用上述的启动方式。
在D中有一个按钮,按钮的事件为D启动A(启动方式与上述一样),同时在启动D启动A这个点击事件中紧接着调用setResult方法和finish方法。
然后D结束跳转到A,但是此时没有调用C的onActivityResult方法。
然后A继续启动B,B启动C同样使用上述的启动方式。
在启动C时,会直接调用C的onActivityResult方法。

求大神指教这个问题的原因。。。。。
我想象的流程
历史栈. A-->B-->C-->D

在D执行启动A同时使用setResult方法依次调用C,B,A的onActivityResult方法
历史栈. A

当结束D,C,B后历史栈中只剩下A

但实际的流程
历史栈. A-->B-->C-->D
在D执行启动A同时使用setResult方法,并没有调用C的onActivityResult方法
历史栈. B-->C-->A
再执行A启动B,B启动C的操作时
历史栈. C-->A-->B
历史栈. A-->B-->C
此时刚进入C页面直接调用了C的onActivityResult方法

  • 写回答

2条回答 默认 最新

  • JabamiLight 2018-04-18 07:34
    关注

    经过我查看的源码,首先 明确一点,每个activity都有对应的ActivityRecord。
    每个ActivityRecord里有
    ArrayList results 保存收到的结果,resultCode以及data等。
    ActivityRecord resultTo; 保存将要接受消息的对象。

    那么按照你的流程,C启动D,那么D的resultTo就是C, D调用finish时,会将resultCode以及data设置到C的results中,然而这时候启动了A,
    A是将要显示到界面的activity。在源码中操作onActivityResult方法是将要显示的activity,所以C没有调用onActivityResult。

    在下一次C将要显示时,发现results的数量不为0,所以就会调用C的onActivityResult方法。

    注意activity需要调用finish才会设置值到他的resultTo中,所以没有调用finish的activity是不能传值的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗