两个Activity之间重复相互跳转时遇到的坑

最近在做的一个应用,主体为两个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 BonDestroy()方法被调用,也就是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 AB处于同一个栈层叠时会发生移除栈顶的问题,那能不能分别为AB指定在不同的Task栈呢?这样明显也是可行的,这种情况下,Act AB分别处于不同的栈,每一个栈都最多只存在一个实例。但后来发现用这种方法明显大材小用了。我当时是这样做的:

  AndroidManifest.xml中为Activity B指定android:taskAffinity="daily.task.test"

然后在Activity A启动Activity BIntent添加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
问题完美解决

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页