`

调用startActivityForResult后,onActivityResult为什么立刻响应

 
阅读更多

今天在编写代码的时候,涉及到两个Activity通过Intent来传值的问题。具体描述为:activity A调用 startActivityForResult()函数启动Activity B,然后B结束时通过setResult()函数将一些值回传给A。

 

笔者过 去使用这种方法很多次,屡试不爽。但是,今天居然出现了一个奇怪的现象,即从B跳回A后并没有按照 预想的逻辑执行,通过抓Log发现,当从A启动B的时候,A中的onActivityResult()和onResume()函数均 被执行。完全不符合逻辑。

 

后来查资料,有人提到这可能与将要跳转的Activity B的启动模式相关。

 

特别是当Activity使用singleTask模式启动的时候,不能使用startActivityForResult()函数,否则就会出现立即 执行onActivityResult()函数。

 

解决方法将要跳转的Activity B的启动模式改为标准模式,问题得到解决。 

 

从柯 元旦的《Android 内核剖析》的第十章“Ams内部原理“10.1.3中有这样的一段话:请注意: SINGLE_TASK标识以及SINGLE_INSTANCE两个标识必 须在r.result==0的条件中,即这两个标识只能用 在startActivity()的方法中,而不能使用在 startActivityForResult方法中。因为从Task的角度看,Android认 为不同Task之间的Activity是不能传递数据 的,所以不能使用NEW_TASK标识,但还是要调用forResult 方法.



 

如图:假设当前的应用程序存在两个栈:其中一个直接显示在屏幕上负责与用户完成交互,叫 BackStack;另一个是隐藏在后台的background task,且位于该栈顶的Activity Y的启动模式被设置为 singleTask。

 

如果Activity 2中调用background Task中已经启动过的Activity Y,则background Task内占据屏幕并 且将该Task下所有的栈保留当前的栈位置和顺序push进back Task形成新的结构。在Activity界面按返回 键,则Activity Y出栈,Activity X占据屏幕。因此可见,由Activity2调用的Activity Y,但返回键后,回退调用startActivityForResult后,onActivityResult为什么立刻响应 显示的是Activity X。所以,即使在Activity执行setResult()函数,Activity2也是无法接收到的。

 

由于这种现象的存在,所以android系统处于某种保护机制,发现将要跳转的Activity的启动模式是 singleTask时,若需要执行onActivityResult()函数则立即执行。

 

 
  • 大小: 150.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics