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

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,这样才能保证回调成功。

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

  1. allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[System.DateTime]

    allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[S ...

  2. 解决父类加载iframe,src参数过大导致加载失败

    原文:解决父类加载iframe,src参数过大导致加载失败 <iframe src="*******.do?param=****" id="leftFrame&qu ...

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

    原文:SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败 先感谢一下我的同事们最先发现此问题,鸣谢:向飞.志刚.海云 最近在生产环境发现一个诡异的问题: 环境:WIN ...

  4. 【转载】Sqlserver强制密码过期导致数据库登录失败

    Sqlserver在设置登录账户信息的时候,有个复选框信息会被默认勾上,即强制实施密码策略,默认勾选上的还有强制密码过期.如果勾上了这个强制密码过期后,则你的账户密码在一定时间登录后会提示Sqlser ...

  5. service_names配置不正确,导致dg创建失败

    service_names配置不正确,导致dg创建失败 伙伴发来消息,创建dg后,主备一直无法进行日志同步. 以下是查看过程 备库的alert日志: 2018-11-13T17:47:36.23129 ...

  6. 云服务器 linux文件系统异常an error occurren during the file system check导致服务器启动失败

    云服务器 linux文件系统异常an error occurren during the file system check导致服务器启动失败 文件系统宕机,重启后报错,无法启动 处理流程: 1.编辑 ...

  7. 所生成项目的处理器架构“MSIL”与引用“***”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器...

    警告:所生成项目的处理器架构“MSIL”与引用“***”的处理器架构“x86”不匹配.这种不匹配可能会导致运行时失败.请考虑通过配置管理器更改您的项目的目标处理器架构,以使您的项目与引用间的处理器架构 ...

  8. 因为错误关闭Selinux导致CentOS7启动失败(进度条卡死,图形界面加载卡死)

    我在CentOS7上安装oracle,非常麻烦,搞半天终于安装完毕,当天我没有发现任何问题,第二天上班打开虚拟机CentOS7就进不去了. 我想起来之前关闭了Selinux,把系统名称改成了redha ...

  9. 解决nginx启动时域名解析失败而导致服务启动失败的问题

    问题: nginx启动或者reload的时候,会对proxy_pass后面的域名进行DNS解析,如果解析失败,启动就会失败或者reload失败. 我们是to B的产品,客户的环境可能是不通公网的,因此 ...

随机推荐

  1. Tornado初探

    Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效 ...

  2. Centos 7 快速搭建IOS可用IPsec

    安装 strongswan yum install -y http://ftp.nluug.nl/pub/os/Linux/distr/fedora-epel/7/x86_64/Packages/e/ ...

  3. vue中请求本地的json数据

    为什么要请求本地的数据?模拟后台的请求数据,验证页面的逻辑是否存在问题,抛开后台提前开发等. 常用的说来有:jq的方式 约等于 axios的方式,vuex状态管理的方式 个人认为最好用的就是jq的方式 ...

  4. Redis笔记(4)独立功能的实现

    1.前言 本节记录一下redis的一些功能上的实现,包括发布订阅.事务.Lua脚本.排序.二进制位数组.慢查询日志和监视器. 2.发布订阅 上一章介绍sentinel的时候说到了sentinel会订阅 ...

  5. Mac 下配置 Python 开发环境

    ➜ ~ sudo brew install python3 ==> Downloading https://www.python.org/ftp/python/3.5.1/Python-3.5. ...

  6. COM+时代的自动事务

    最近看公司的遗留项目代码,调试的时候发现经常报分布式事务错误,可是整个代码里没有看见开启过事务,于是开始研究,发现了这个.Net Framework1.1时代的产物. namespace Busine ...

  7. Struts2+AJAX+JQuery 实现用户登入与注册功能。

    要求 必备知识 JAVA/Struts2,JS/JQuery,HTML/CSS基础语法. 开发环境 MyEclipse 10 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到演示地址哦): 关于U ...

  8. 用Elasticsearch做大规模数据的多字段、多类型索引检索

    本文同时发布在我的个人博客 之前尝试了用mysql做大规模数据的检索优化,可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景. 但是实际应用往往会复杂一些 ...

  9. nginx配置文件nginx.conf 不包括server节点

    整理的一个nginx.conf的配置,不包括server节点介绍 原文请查看,Nginx配置文件(nginx.conf)配置详解 # For more information on configura ...

  10. guava EventBus 消息总线的运用

    public class Test { public static void main(String[] args) { final EventBus eventBus = new EventBus( ...