Android SingleTask使用注意点
来源:互联网 发布:debian7 安装nginx 编辑:程序博客网 时间:2024/05/29 09:50
现象
今天在编写代码的时候,涉及到两个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,但返回键后,回退显示的是Activity X。 所以,即使在Activity执行setResult()函数,Activity2也是无法接收到的。
由于这种现象的存在,所以android系统处于某种保护机制,发现将要跳转的Activity的启动模式是singleTask时,若需要执onActivityResult()函数则立即执行。这样就好理解多了
在ActivityA中,startActivityForResult到ActivityB,其中ActivityB设置为SingleTask。
那么在实际出现的现象为:
ActivityA的onActivityResult将会首先被回调,然后再执行ActivityB的onCreate函数,也就说无论ActivityB返回什么内容,在ActivityA中都不会被接收到。
所以在使用SingleTask的方法不要随便使用。
另外onNewIntent()就是针对SingleTask使用的回调,当执行调用多个Activity对象的时候,会回调onNewIntent对象。
- Android SingleTask使用注意点
- Android SingleTask使用注意点
- SingleTask启动activity注意点
- Android TabLayout使用注意点。
- android SharedPreferences 使用注意点
- 关于使用Android Application的注意点
- Android中使用数据库的注意点
- Android 使用Gif图片及其注意点
- android layout_weight的使用注意点
- Android中使用DrawerLayout的注意点
- android service使用详解及注意点
- Android存储的使用笔记-注意点
- android点9图的使用与注意点
- Android startActivityForResult与singleTask使用问题
- android singleTask
- android singleTask
- Android开发注意点
- Android开发注意点
- SEAndroid 浅谈
- 盒模型
- huaqi Total
- DALVIK JIT 入口分析
- 学C++百度
- Android SingleTask使用注意点
- 自定义View
- 常用的时间序列算法模型
- Android开发-API指南-<permission-group>
- 自定义Dialog
- [C++]排序模板(含C++模板代码)
- 【NGUI】Unity中使用NGUI和FingerGestures插件点击UI穿透的问题
- merge查询的基本用法
- 移动端meta标签的含义