调用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的启动模式改为标准模式,问题得到解决。

分析

找到的一些资料:(摘抄自http://aijiawang-126-com.iteye.com/blog/1717326)从SDK我们可以看到如下深奥的解释:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode The other modes — singleTask and singleInstance — are not appropriate for most applications, since they result in an interaction model that is likely to be unfamiliar to users and is very different from most other applications. 从柯元旦的《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,但返回键后,回退显示的是Activity X。所以,即使在Activity执行setResult()函数,Activity2也是无法接收到的。
      由于这种现象的存在,所以android系统处于某种保护机制,发现将要跳转的Activity的启动模式是singleTask时,若需要执行onActivityResult()函数则立即执行。这样就好理解多了

时间: 2024-10-02 01:03:35

调用startActivityForResult后,onActivityResult为什么立刻响应的相关文章

总结:调用startActivityForResult,onActivityResult无响应的问题

人人都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数. 但你是否遭遇过onActivityResult()不执行或者未按预想的那样执行的情况呢? 这里我总结了三种情况: 1.执行startActivityForResult,没等到被调用的 Activity 返回,onActivityResult() 就被执行了. 找了很久,终于通过小道消息得知,这与 Activity 的加载模式(launchMode)有关,该

Android基础:startActivityForResult 和 onActivityResult 问题

项目中用到弹出Acitivity来获得用户输入 所以用到 onActivityResult()方法接受用户输入 奇怪问题 startActivityForResult() 后直接调用 onActivityResult()    开发人员都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数.然而在项目中,还没等到被调用的 Activity 返回,onActivityResult() 就被执行了.找了很久,终于通过小道

Android Activity 调用startActivityForResult之后被销毁?

Android Activity 调用startActivityForResult之后调用的Activity被销毁的问题 最近在华为的手机上面发现Activity调用startActivityForResult后返回结果时,调用的Activity都会被重新创建,也就是Activity被销毁了. 在网上经过一番查找,发现有哥们说在手机开发人员选项里面有这么一项"不保留活动"被勾上了, 一看还真是. 把那个勾去掉一切又恢复正常了.

BUG系列:调用startActivityForResult()&onActivityResult()无响应

前天遇到了一个麻烦,还真是麻烦啊! 我使用startActivityForResult()&onActivityResult(),由Activity-A 跳转到Activity-B 页面,然后在Activity-B页面编辑完个人资料之后携带个人数据交回到Activity-A页面:其实很简单的问题,但是 让我没有预料到的是竟然出现了岔子!下面展示我的效果图及正确的代码: 这些代码是作为编辑昵称:<Activity-B页面> public class EditToNickNameAty e

调用startActivityForResult启动activity,返回当前页不响应的问题(附带activity携带参数流程)

最近在项目遇到这样一个问题,原始的activity不是为我写,后面我要改成返回activity携带参数.我改好了之后 发现不能调用onActivityResult.调试也没有问题,activity结束时候我也是用finish函数的.这样的话,不细心就不会查到Manifest 配置activity语句上.下面说说不响应的问题. 一.Manifest 配置的启动方式有关 activity跟 Manifest 配置的启动方式有关,不要配置启动方式:android:launchMode="singleT

BUG系列:转让startActivityForResult()&amp;amp;onActivityResult()没有反应

前天遇到了一个麻烦,还真是麻烦啊. 我使用startActivityForResult()&onActivityResult().由Activity-A 跳转到Activity-B 页面,然后在Activity-B页面编辑完个人资料之后携带个人数据交回到Activity-A页面.事实上非常easy的问题,可是 让我没有预料到的是居然出现了岔子.以下展示我的效果图及正确的代码: 这些代码是作为编辑昵称:<Activity-B页面> public class EditToNickNameA

由STL map调用clear后,内存不返还给操作系统的问题出发,探讨glibc malloc/free行为

本博客所有的代码在github中. https://github.com/lzueclipse/learning/blob/master/c_cpp/malloc_and_my_cache/ 1. 问题 我们的程序有几十个线程,每个线程拥有一个std::map,每个线程都要向自己的std::map中插入大量的数据,但每个数据只有几十字节:当使用完std::map,调用map.clear(),删除map里的所有元素,发现std::map所占内存没有返还给操作系统:甚至std::map析构后,内存仍

模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口(转)

上周准备在公司内部转岗,面了3个部门windows客户端相关的工作,最终拿到3个Offer,主要涉及C++和Windows两大块内容,C++的题目基本都答上了,Windows一直都是我的弱项,在这里记录一下Windows相关的题目.有些答不上的问题就没列出来,还有些问题忘了,下面的答案有些大部分是我自己的理解,有些是直接从网上copy的,有问题大家可以讨论. 1:GetMessage和PeekMessage的区别? GetMessage:获取消息队列中的一个消息,存入MSG中,并从消息队列中移除

AS3 调用gotoAndStop后,显示对象为null的解决方法

再使用flash制作UI资源时通常我们会在一个MC的不同帧中引入其他的MC(有可能引入的MC中还包含了MC),并为这些引入的MC设置实例名称.通过使用gotoAndStop到第几帧来引用里面的资源...可惜有的时候会报:引入的这个显示对象为null....这该如何是好呢?? 接下来就是我在使用FB与IDEA进行实际工作的时候找到的一些解决办法... 第一种: 有时候我们使用的已经是别人做好的UI...或者是自己通过反编译出来的UI... 用flash打开后导入IDEA中如果使用gotoAndSt