小编工作也有一段时间了,平时学东西挺多,但是总感觉学的东西忘得特别快,所以希望在学习的过程中可以把遇到的难题记录下来,一方面可以方便自己复习,另一方面帮助有同样问题的博友节省一些学习的时间,如果写的有什么不妥的地方,还请大家多多指正。
本篇文章的写的是在使用activity的启动模式的时候,如果它们的启动模式不同,并且有多个activity一起使用,它们的任务栈怎么分配 ,新启动的activity对已有的activity产生怎样的影响,我们将详细说明。
activity四种启动模式,即standard,singleTop,singleTask,singleInstance,如果你对这四种启动模式还不太了解,推荐你去看一下这篇文章,写的很详细:
http://blog.csdn.net/liuhe688/article/details/6754323
接下来我们将讨论混合使用的情况,为了使思路清晰,我们集中以一个launch model为主的分开分析方法,这里需要用到一个adb命令(做开发不懂这个就过分了,度娘告诉你一切),adb shell dumpsys activity,这个命令可以帮我们查询现在正在运行的activity的详细情况,包括它所属的栈情况,一会我们也会用到这个命令。
1,首先从standard为主开始(以下A均为MainActivity):
a),如果两个activity(A和B)都是standard模式,并且都是以start activity的方式开启(即A里边用intent开启B,或者B里边用intent开启A),则会不断的在同一个栈中生成A和B的实例,按back键的时候则是按生成顺序的反向一个个退栈。
b),如果A是standard,B是single top,这个也比较好理解,类似上一个,区别是,当A或B在栈顶部的时候,在开启同一个activity,此时不会创建新的实例,而是复用已存在的顶部那个activity。
c),如果A和B是standard,在创建一个activity ,名字叫C,启动模式single task:A里启动C,然后C里启动B,此时它们还是再同一个栈里。因为C是single task,栈里只能有一个C的实例,如果再启动C的话,系统会把C上边的所有activity退栈,即销毁C上的所有activity,然后复用C。
d),这个比较复杂了,同样A和B是standard,C是single instance,A中开启C,此时C会开启一个新任务栈,假设A的任务栈是Task1,C的任务栈是Task2。此时若C再开启B的话,B会在Task1中创建自己的实例(利用adb命令获得的图1)看Runing activities下的内容,发现,A和B的栈id为73,C的栈id是74。再者,在B中再次开启C,虽然C是single instance,也不创建新的实例,而是复用Task2中已存在的C(图2),C没生成新的栈,栈id也未变。