两个Activity之间重复相互跳转时遇到的坑
2017-05-17 15:32
357 查看
两个Activity之间重复相互跳转时遇到的坑
转载地址:http://blog.csdn.net/qq_26918031/article/details/52749685 最近在做的一个应用,主体为两个Activity,交互时需要来回在两个Activity之间跳转,首先Act A先启动,然后Act A启动Act B,之后Act B可以通过startActivity()(没有其他方法了吧?)再次回到Act A,同样在Act A也可以再次进入Act B;其中A、B我们只需要初始化一次,也就是onCreate()方法只执行一次,后续重复使用已存在的ActA,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()方法被调用,也就是ActB被销毁了,在 Act A→ Act B → Act A → Act B时,第二次启动Act B时onCreate()被调用,此时ActB非彼Act B,是一个全新的实例。 仔细查看相关资料后发现,在一个Task中,Activity实例以栈的形式存储,栈这种数据结构的特点是先进后出。通常一个Application有一个默认Task,在Activity的launchMode都为singleTask时,第一次ActA → Act B后,Act B在栈顶,Act A在栈底;Act A→ Act B → Act A时,由于Act A实例已经存在,不必新建只需调到栈顶,重点来了,此时ActA之上的Activity实例都会被移除,直到Act A处于栈顶。到我们再次启动Act B,由于栈内已经没有ActB的实例,将会重新新建一个Act B的实例压入栈顶。 问题的原因知道了,那怎么解决呢 既然Act A,B处于同一个栈层叠时会发生移除栈顶的问题,那能不能分别为A,B指定在不同的Task栈呢?这样明显也是可行的,这种情况下,ActA,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之间重复相互跳转时遇到的坑
- Android 两个Activity之间相互跳转传值 并且关闭之前的Activity
- 两个,三个Activity之间的相互跳转
- android81--两个Activity之间跳转时必然会执行的是哪几个方法
- android之两个activity相互跳转
- 【总结】在两个Activity之间进行跳转时出错原因分析(二)——在AndroidManifest.xml未声明导致
- 两个Activity之间跳转问题之activity的四种加载模式
- fragment与activity及两个fragment之间的跳转实现
- 封装类中实现另外两个Activity之间的跳转
- 为啥我的两个activity之间跳转失败
- 简单实现两个activity相互跳转
- Android中两个Activity之间的跳转
- Android混合开发之Activity类与html页面之间的相互跳转
- Android混合开发之Activity类与html页面之间的相互跳转(并解决黑屏问题)
- 两个Activity之间跳转时,生命周期的执行顺序
- 使用Intent对象来实现两个(或多个)Activity之间的跳转,并实现在Activity之间传递参数。
- 【总结】在两个Activity之间进行跳转时出错原因分析(一)——findViewById位置不当导致
- Android混合开发之Activity类与html页面之间的相互跳转(并解决黑屏有关问题)
- 3. 调用另一个Activity,并两个Activity之间相互传递数据
- fragment与activity及两个fragment之间的跳转实现