这可能是个坑 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 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试