以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方法

经过我查看的源码,首先 明确一点,每个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是不能传值的。

仔细看下面FLAG的介绍,答案就在其中:没有创建新的activity对象,使用的是之前的activity对象
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。