完美解决Android中onActivityResult提前执行调用的一系列问题_codekxx的博客-程序员秘密

技术标签: android  Android  启动模式  

这是原本要启动的AddressActivity

int requestCode = 200;
Intent intent = new Intent(this,AddressActivity.class);
startActivityForResult(intent,requestCode);

AddressActivity回传携带的数据

Intent mIntent = new Intent();
mIntent.putExtra("addr_id", retData.get(position));
// 设置结果,并进行传送
setResult(resultCode, mIntent);
finish();

manifest.xml配置

<activity android:name=".activity.AddressActivity" android:launchMode="singleTask"/>

仔细检查好多遍之后,代码没有任何问题,onActivityResult方法一直回调不过来数据,debug调试以后才发现onActivityResult方法在开启另外一个activity的时候提前执行了,思来想去,实在没有任何头绪,正在想放弃的时候,突然发现manifest.xml配置AddressActivity的启动模式是singleTask,就抱着试试看的态度,把他改成了标准启动模式,然后突然回传数据了。

通过查资料才发现:
找到的一些资料:(摘抄自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()函数则立即执行。这样就好理解多了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/codekxx/article/details/53495316

智能推荐

Css基础学习_icecityman的博客-程序员秘密

 CSS基础学习现在web开发人员如果不知道CSS那就太落伍了,不过知道不等于会使用,更不等于精通。而我刚好属于那个知道CSS是干什么的,仅此而已的一员。CSS:Cascading Style Sheet,层叠样式表,可以将网页的大部分甚至全部的表示信息从HTML文件中移出,达到表现信息和核心内容相分离,达到易于维护以及美工和程序员分工更加明确的好处。这么好的东西是怎么应用到网页上面的呢?我们先来

oracle外建什么作用,列举在数据库中外键的好处以及优劣_弓长丶艮的博客-程序员秘密

外键的好处:1减少重复数据在删除主表数据前先删除与之相关的子表的相关数据原则上主表的数据是不允许删除的2可以设置级联删除和更新,保证数据库的完整性3外键在一定程度上说明了业务逻辑,会使设计周到具体全面保证了数据的一致性,完整性,程序无法100%确保数据的完整性,从这个角度看,外键似乎很有必要,最主要的无非是数据的完整性外键的缺点:1过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题2不用...

用ShellExecuteEx打开文件,文件夹_HelloBj的博客-程序员秘密

 用ShellExecuteEx打开文件,文件夹<br />先来看看“深入浅出ShellExecute”<br /> <br /> Q: 如何打开一个应用程序?ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );或ShellExecute(this->m_hWnd,"open","notepad.exe",<br /> "c://MyLog.log","",SW_SHOW );正如您所看到的,我并没有传递程序的完

2014年12月2日更新完英雄联盟一直显示无法连接服务器,【致想玩韩服LOL的Mac用户】macOS Sierra[10.12.4可用]下安装英雄联盟新客户端并连接到韩服服务器..._墨研花开的博客-程序员秘密

本帖子致那些想玩韩服LOL的Mac用户首先,之前我写过一篇帖子是针对Mac用户用旧客户端玩韩服的,不过Riot Games于2017年4月24日废弃旧客户端,在这段时间到2017年5月6日内,均可以用强制启用旧客户端的方法启动旧客户端并玩韩服。不过在2017年5月6日早上起床之后,发现强制启动旧客户端的方法也不行了,旧客户端登录的道路被封掉了。下面是新客户端如何链接到韩服服务器的方法:1、升级最新...

Android TextView控件_䴖鵂的博客-程序员秘密

TextViewTextView控件用于显示文本信息,我们可以在XML布局文件中以添加属性的方法来控制TextView的样式,以下是TextView在XML不均文件中的常用属性。TextView常用属性属性名称功能描述android:layout_width设置TextView控件的宽度android:layout_height设置TextView控制的高度android:id设置TextView控制的唯一标识android:background设置Tex

【Elasticsearch】文本分析 Text analysis 查询_search中使用分析 (3)_小雨青年的博客-程序员秘密

内置的analyzerfingerprint指纹分析器实现了一个指纹算法,OpenRefine项目使用该算法来协助聚类。内部的流程为转换小写去掉扩展字符排序删除重复字符删除配置的停止(stop)单词示例如下POST _analyze{ "analyzer": "fingerprint", "text": "Yes yes, Gödel said this sentence is consistent and."}[ and consistent godel is sa

随便推点

Siebel CRM 全接触_艾沙可牛的博客-程序员秘密

 作者简介何荣勤先生,Siebel 认证咨询专家,从事IT业多年,并拥有Intentia Movex、Siebel eBusiness 等应用系统的丰富实施经验。目前在澳大利亚悉尼一家美国跨国公司任信息技术部主管,并兼任大中华区客户关系管理 (GreaterChinaCRM.org)研究所所长。 1、前言CRM(客户关系管理)可以说是近几年来讨论得最多最热的话题之一,不论是在国

配置yum来安装光盘rpm包并解决依赖性问题_weixin_33937913的博客-程序员秘密

1、检查系统中有没有安装createrepo包,如果没有,进行安装。# rpm -qa|grep createrepo# rpm -ivh /media/Server/createrepoxxxx2、将光盘或者iso mount到/media3、建立文件夹 mkdir -p /var/RHEL5/{Cluster,ClusterStorage,Server,VT}4、生成re...

再见迅雷!推荐一个绿色无广告的开源下载工具_开源前哨的博客-程序员秘密

【导语】:如今要找出一款干净无广告的下载工具,貌似不那么容易了。今天推荐一个开源 BT 下载工具。简介LIII BitTorrent Client 是一个开源文件共享程序,能够下载 torrent,最大程度的减少对系统资源的占用。LIII 非常干净,非常简单,没有烦人的广告和多余的后台程序,界面简洁易用,并且性能还不错。除了标准功能外,LIII 客户端还提供了方便的下载管理,灵活的设置等,可以从URL 或磁力链接打开种子,对系统资源要求不高。 项目地址是:https://github.com/

剑指offer编程题--用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。_渣渣洒泪成长记的博客-程序员秘密_栈的push和pop例题

首先看图大概知道考察的是队列和栈基本知识,需要知道jdk的stack的方法的使用,以及栈队列先进后出,队列先进先出的知识栈先进先出,队列先进后出stack1.push(1);stack1.push(2);stack1.push(5);上面这样顺序存储的化栈的输出是:521,队列就是:125栈的基本方法:push存数据,pop只能取出栈顶并移除顶部思考:调用push的时候stack1存1,2,5以后,再调用pop的时候,我们从stack1取,那肯定是5,2,1的顺序,然后存到st

Inno Setup打包教程_Sakuya__的博客-程序员秘密_inno setup

简述Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年,现在已经更新到Inno Setup 5了。Inno Setup是一个十分简单实用的打包小工具,可以按照我们自己的意愿设置功能,稳定性也十分好。官方网址:http://www.jrsoftware.org/安装教程一、下载安装官方下载地址:http://www.jrsof...

eclipse提交代码git 报错checkout conflict with files 的解决办法_weixin_30550081的博客-程序员秘密

昨天下班的时候提交git代码,提交的时候没有勾选自动生成的日志文件,感觉上传上去没有什么用处。然后回家的时候更新了一下代码,重新提价了一次。今天再次来到公司更新代码的时候报错,记录一下,是如何解决的。1.选中项目邮件 team-&gt;Synhronize workspace,就发现了有冲突的地方。2.选中有问题的文件 进行查看,将两份不同的代码进行整合。然后保存一下,这样子就不...

推荐文章

热门文章

相关标签