完美解决Android中onActivityResult提前执行调用的一系列问题
2016-12-06 23:20
387 查看
这是原本要启动的AddressActivity
AddressActivity回传携带的数据
manifest.xml配置
仔细检查好多遍之后,代码没有任何问题,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方法。
如果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()函数则立即执行。这样就好理解多了。
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()函数则立即执行。这样就好理解多了。
相关文章推荐
- ubuntu10.04编译安装gvim7.3,完美解决一系列问题
- 完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题
- android调用系统相机(通用,完美解决4.0以后版本以及机型的问题)
- 完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
- [转]浅论ViewController的加载 -- 解决 viewDidLoad 被提前加载的问题(pushViewController 前执行)
- android 调用系统相机或者系统相册功能时,onActivityResult方法不执行问题的解决过程
- Java调用exe,exe在任务管理器中挂起未执行问题解决方法
- 解决VS2012 WPF中“对类型“ ”的构造函数执行符合制定的绑定约束的调用时引发了异常。行号为“3”,行位置为“9””问题的过程
- C# WPF VS2012 对类型“ ”的构造函数执行符合指定的绑定约束的调用时引发了异常 问题解决办法 产生什么原因
- Android 不同手机的cpu架构不同导致的一系列第三方sdk调用出问题的解决办法
- 解决android程序中oncreate方法中调用百度地图MKSearchListener接口不执行的问题
- 完美解决PowerPoint 2007无法输入汉字及Office自动调用输入法的问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- 执行文件下载Java 调用 FFMPEG 命令时用 url 作为输入源,Linux 下出现 “no such file or directory” 问题的解决
- 完美解决ListView和CheckBox焦点冲突及复用时CheckBox错位等一系列问题
- 完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题
- 解决Android中调用百度地图MKSearchListener接口回调方法不执行的问题
- 解决Ajax在兼容模式下后台调用执行两次结果不变的问题(已解决)!
- 解决存储过程执行快,但程序调用则执行慢的问题
- 动态加载JS文件,完美解决跨域、编码、嵌套、队列、兼容性、执行顺序等相关问题。