今天在编写代码的时候,涉及到两个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()函数则立即执行。
相关推荐
3个方法的介绍和使用 startActivityForResult(Intent intent, int requestCode ) onActivityResult(int requestCode ,int resultCode, Intent data) setResult(int resultCode,intent intent)
当我们调用startActivityForResult()方法来跳转页面的时候需要重写onActivityResult方法,不然就和startActivity没什么两样,这个demo就是简单说明调用时间。流程如下:MainActivity::onCreate MainActivity::...
基于RxPermissions框架思想,在使用startActivityForResult可以不重写onActivityResult回调
使用StartActivityForResult进行Activity跳转传值的小例子
startActivityForResult过时.md
使用startActivityForResult回传数据
singleTask和startActivityForResult的纠葛(activity的重建/onActivityResult回调为0) 问题验证: 1.startActivityForResult打开singleTask模式的活动,singTask失效。(见Action2) 2.singleTask模式的活动...
介绍了StartActivityForResult的运用,并总结了一些问题及答案,可供初学者参考,代码无误,放心运行!
告别onActivityResult ,用代理实现获取startActivityForResult结果以及权限检查管理的工具类
添加本地图片和调用系统拍照图片主要是通过调用acitivity跳转startActivityForResult Intent intent int requestCode 方法和activity返回结果onActivityResult int requestCode int resultCode Intent data 方法来...
涉及:activity跳转、intent使用、startActivityForResult/onActivityResult,着重讲解通过来Application Context实现共享数据
fragment 通过startActivityForResult方法启动另一个activity,返回时,不调用onActivityResult方法, 解决步骤: 1. 在Fragment所属的Activity中,重写了onActivityResult方法,确保加上super.onActivityResult ...
startActivityForResult
Android之Intent通过startActivityForResult方法启动新Activity
一种 startActivityForResult 更简单流程
startActivityForResult获得通讯录中电话信息
关于startActivity被大家忽略的 Fragment中的startActivityForResult方法
startActivityForResult使用方式,代码比较简单
这里实现的效果是,点击a Activity后,屏幕会跳转到手机的通讯录,任意选择点击一个通讯录中的联系人,则从通讯录Activity跳回到a Activity并在a Activity上显示你刚才选择通讯录联系人的名字。