singleInstance和singleTask导致startActivityForResult回调失败

先来了解下这两种启动模式:

1.singleInstance,全局唯一,它的实例在全局(即在众多任务栈中)是唯一的,它单独地存在于属于自己的任务栈中,而且这个任务栈没有其他实例。

2.singleTask,任务栈中唯一,它的实例在任务栈中是唯一的。它在被Intent的时候,会先在系统中查找属性值affinty与它的属性值taskAffinity相同的任务栈是否存在,如果存在,则在这个任务启动,如果不在,则在新任务栈中启动。如果想要这种启动模式的activity在新的任务栈中启动,就要为它设置单独的taskAffinity。请记住,如果设置了单独的taskAffinity,那么这种启动模式的activity就会跟启动它的activity不在同一个任务栈中。

为什么singleInstance会导致回调失败呢?我们来模拟一下:

A是默认启动模式,B是singleInstance,在A中startActivityForResult() B

查看log日志:

在A中startActivityForResult()后,A马上失去焦点,接着立即回调了onActivityResult(),resultCode=0也就是结果码是RESULT_CANCELED。因为立即回调了onActivityResult(),所以A重新获得焦点onResume然后失去焦点,最后B起来。

同样,A是singleInstance,B是默认启动模式,或者A和B都是singleInstance,都是在A中startActivityForResult() B,得到的结果跟上述一样。

为什么目标的是singleTask会导致回调失败呢?

A是默认启动模式,B是singleTask(没有单独的taskAffinity),在A中startActivityForResult() B

查看log日志:

得到的结果跟使用了singleInstance是一样的。

如果A是默认启动模式,B是singleTask(设置单独的taskAffinity),得到的结果也是跟上述一样。

根据结果,分析如下:

1.因为当使用了singleInstance,两者就不在同一个任务栈中,所以startActivityForResult回调失败。

2.我觉得,因为当使用了singleTask以后,接intent的Activity就有可能跟发intent的不在同一个任务栈中(设置了单独的taskAffinity),所以startActivityForResult回调失败。

结论是:如果发现两者有可能不在同一个任务栈中,startActivityForResult回调失败。。。。那么在使用startActivityForResult时,发Intent和接Intent的activity最好都是默认启动模式,否则要保证发Intent的不是singleInstance以及接Intent的不是singleInstance或singleTask,这样才能保证回调成功。

原文地址:https://www.cnblogs.com/zhujiabin/p/10224245.html

时间: 2024-11-09 19:02:38

singleInstance和singleTask导致startActivityForResult回调失败的相关文章

php7微信支付回调失败

升级完PHP7 发现微信支付回调失败.原来是 $GLOBALS['HTTP_RAW_POST_DATA'];没有定义的问题.php7 移除了这个全局变量. 修改如下: //获取通知的数据 $xml = $GLOBALS['HTTP_RAW_POST_DATA'];//这里在php7下不能获取数据,使用 php://input 代替 if(!$xml){ $xml = file_get_contents("php://input"); }

Linux下中断程序导致写文件失败的分析

案例: 一个普通linux C程序,执行期间会进行多次printf操作,利用bash脚本重定向功能,将stdout重定向到一个另一个文件中去.在运行途中用ctrl+C终止程序,发现定向文件始终为空,即写失败. 分析: 原本以为是bash重定向机制导致的问题,于是将重定向取消,改为使用fprintf,而非printf.即在C程序内部进行写文件.发现问题依旧.(排除fopen打开失败的因素) 仔细观察,发现问题集中在两个层面,一个是ctrl+c到底做了什么,二是写文件操作为什么失败. 首先,ctrl

QQ和Qzone分享回调失败以及为分享成功回调成功多次问题

一.QQ和Qzone分享回调失败 起初一开始我按照官方给的说明配置好,都是可以回调的,后期版本更新后莫名其妙就回调不回来了,因此我就去找了QQ和Qzone的相关问题,发现都是好几年提的,说回调不成功. 后来仔细的去对比版本更新改变的内容才发现原来是AndroidManifest.xml文件中的exported属性. 如果Service等的AndroidManifest中声明为android:exported="false"则该服务不能够跨进程使用.  Permission Denied

解决因生成javadoc失败导致Maven打包失败问题

方案就是设置javadoc生成失败时不导致整个打包失败: 1 <plugin> 2 <groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-javadoc-plugin</artifactId> 4 <version>2.8</version> 5 <executions> 6 <execution> 7 <id>a

SPFILE导致数据库启动失败

服务器断电重启后,报数据库服务无法启动,在服务器上使用AS SYSDBA 登录后连接到空实例, 使用startup启动时报'ORA-24324: 未初始化服务句柄,ORA-01041: 内部错误, hostdef 扩展名不存在'错误. 分步启动startup nomount ,依然报以上错误,判断为spfile文件损坏造成.但本机没有使用pfile备份过spfile,而修改spfile要启动修改. 解决办法,手工创建pfile 文件INITSID.ORA,打开alert日志,找到数据库启动信息,

哪些原因会导致创业的失败呢?

导语:成功是每位创业者的梦想,但成功毕竟只属于少数人.如果你刚刚踏上创业之途,避免以下可能导致创业失败的七个错误,或许成功会眷顾到你. 如果你正准备创业,失败是一条必经的道路.但如果你无法弄明白失败的原因,成功永远不会眷顾到你.以下是可能导致创业失败的七个主要原因: 一:把收入看得比客户还重 把收入看得太重是创业失败的一个重要原因.刚开始创业的时候,千万不要把收入看的太重,更不能忽视客户.当然,笔者并非是"教唆"创业者不重视收入,但是相对于客户资源而言,赚钱更简单些,因为只要有客户,公

SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败

原文:SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败 先感谢一下我的同事们最先发现此问题,鸣谢:向飞.志刚.海云 最近在生产环境发现一个诡异的问题: 环境:WINDOWS 2012+SQLSERVER 2012 SP1,双节点的故障转移群集+单节点的SQLSERVER 2012 SP1实例(镜像) 生产数据库是从SQLSERVER 2008R2迁移到2012的,迁移过程很顺利,按照一般经验,可能导致数据库所有者丢失,因此在迁移后手动修改数据库所有者为sa,与

Ubuntu+Win删除分区导致GRUB引导失败的处理

个人计算机采用单硬盘Ubuntu+Win 第一分区win 第二分区ubuntu  第三分区  资料盘NTFS 删除ubuntu分区导致grub引导失败,开机出现Grub>提示符.可能是因为分区已经删除的原因,多种修复grub的方式均无效(ls  root  profix命令) 采用win7引导工具进入diskgen  只能看到第一分区 重建分区表查找到所有分区.保存分区表 修复MBR引导方式.保存,重启.可引导进入windows

Windows 更新导致 VirtualBox 启动失败 VBoxDrvStub error

win8 导入virtualbox介质发生错误, NtCreateFile(\Device\VBoxDrvStub) failed: Unkown Status - 5600 (0xffffea20) (rcNt=0xe986ea20) VBoxDrvStub error: ntdll.dll: 7982 differences between 0x300c and 0x4fff in #1 (.text), first: 4c != 1f (rc=-5600) 尝试了各种办法,下载非最新版本v