今天编码的时候,设计两个Activity之间的跳转,A->B,用了StartActivityForResult,为了用来判断是否请求然后刷新的,原本是可以正常刷新的,但是现在居然不行,有点莫名其妙,于是我在onActivityResult方法里打印log,发现只要一跳转到B界面,onActivityResult就执行了,为什么调用onActivityForResult之后,为什么onActivityResult立即响应?完全不符逻辑。查资料发现是与将要跳转的Activity的启动模式有关,特别是当启动模式为SingleTask的时候,不能使用onActivityResult函数,否则会立即调用onActivityResult函数。
如图:假设当前的应用程序存在两个栈:其中一个直接显示在屏幕上负责与用户完成交互,叫BackStack;另一个是隐藏在后台的background task,且位于该栈顶的Activity Y的启动模式被设置为
singleTask。
![](http://userimage6.360doc.com/15/0123/14/12928831_201501231409390363.png)
如果Activity 2中调用background Task中已经启动过的Activity Y,则background Task内占据屏幕并且将该Task下所有的栈保留当前的栈位置和顺序push进back Task形成新的结构。在Activity界面按返回键,则Activity Y出栈,Activity X占据屏幕。因此可见,由Activity2调用的Activity Y,但返回键后,回退显示的是Activity X。所以,即使在Activity执行setResult()函数,Activity2也是无法接收到的。