两个Activity之间重复相互跳转时遇到的坑
来源:互联网 发布:哪个cms好 编辑:程序博客网 时间:2024/05/01 11:47
最近在做的一个应用,主体为两个Activity,交互时需要来回在两个Activity之间跳转,首先Act A先启动,然后Act A启动Act B,之后Act B可以通过startActivity()(没有其他方法了吧?)再次回到Act A,同样在Act A也可以再次进入Act B;其中A、B我们只需要初始化一次,也就是onCreate()方法只执行一次,后续重复使用已存在的Act A,B实例。
看似很简单的要求,我首先想到的就是两个Activity的launchMode都设置为singleTask。
在singleTask模式下, Task栈中将只会存在一个该Activity的实例。而在standard模式下,重复使用Intent启动Activity将新建新的Activity实例,也就是onCreate()将得到执行,此时Task中将存在多个相同的Activity实例,明显不满足要求,使用singleTask模式貌似能避免这个问题。
使用singleTask后重复实例的问题是解决了,Task栈中确实只同时存在一个Act A和Act B实例,但通过调试发现,当下面跳转(→表示启动)
Act A→ Act B → Act A
跳转后,Act B的onDestroy()方法被调用,也就是Act B被销毁了,在
Act A→ Act B → Act A → Act B
时,第二次启动Act B时onCreate()被调用,此时Act B非彼Act B,是一个全新的实例。
仔细查看相关资料后发现,在一个Task中,Activity实例以栈的形式存储,栈这种数据结构的特点是先进后出。通常一个Application有一个默认Task,在Activity的launchMode都为singleTask时,第一次Act A → Act B后,
Act B在栈顶,Act A在栈底;Act A→ Act B → Act A时,由于Act A实例已经存在,不必新建只需调到栈顶,重点来了,此时Act A之上的Activity实例都会被移除,直到Act A处于栈顶。到我们再次启动Act B,由于栈内已经没有Act B的实例,将会重新新建一个Act B的实例压入栈顶。
问题的原因知道了,那怎么解决呢 既然Act A,B处于同一个栈层叠时会发生移除栈顶的问题,那能不能分别为A,B指定在不同的Task栈呢?这样明显也是可行的,这种情况下,Act A,B分别处于不同的栈,每一个栈都最多只存在一个实例。但后来发现用这种方法明显大材小用了。我当时是这样做的:
在AndroidManifest.xml中为Activity B指定android:taskAffinity="daily.task.test"
然后在Activity A启动Activity B的Intent添加Flag:
Intent.FLAG_ACTIVITY_NEW_TASK
此时存在两个Task,两个Activity都启动后,直观感受就是一个应用在后台卡片列表中存在两个卡片。像这样:
后来又仔细看了许多资料介绍,在这篇博客(感觉大神们的收集和整理)
http://blog.csdn.net/lizhiguo0532/article/details/7480993
中注意到这个Flag:
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
表示“如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶“。这正是我们需要的
索性删除taskAffinity,LaunchMode都改为改为standard,启动时的Intent都添加上Flag:
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
问题完美解决
- 两个Activity之间重复相互跳转时遇到的坑
- 两个Activity之间重复相互跳转时遇到的坑
- 两个,三个Activity之间的相互跳转
- 两个Activity之间的跳转
- Android 两个Activity之间相互跳转传值 并且关闭之前的Activity
- Android activity相互跳转后台出现两个页面的坑
- 两个Activity之间跳转时,生命周期的执行顺序
- 两个Activity之间跳转时,它们生命周期的执行顺序
- 两个Activity之间跳转时,生命周期的执行顺序
- 两个Activity之间跳转时,生命周期的执行顺序
- Android中两个Activity之间的跳转
- 两个Activity之间跳转执行的生命周期
- 两个应用之间相互跳转
- Activity的生命周期以及两个activity之间跳转的问题
- 安卓中view、activity、fragment之间的相互跳转
- android之两个activity相互跳转
- 两个activity相互跳转退不出去
- 简单实现两个activity相互跳转
- 分享一道有意思的HTML题
- Clojure 学习入门(3)- 数字类型
- 拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录
- Android Studio 问题记录-全部java文件全部报错,却可以运行
- SQL符合函数查询
- 两个Activity之间重复相互跳转时遇到的坑
- 递归神经网络RNN原理——Elman网络原理——结合实例MATLAB(BPTT算法)实现
- Leetcode-67. Add Binary
- MySQL关于Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
- HDU 1671 Phone List
- oracle 下载地址(备忘)
- 389.leetcode Find the Difference(easy)[字符串处理]
- [LeetCode]--172. Factorial Trailing Zeroes
- SQL聚合函数查询