Android基础 第一章 第二节Activity启动模式(笔记)

关于Activity的启动模式,一共有四种。我们可以在AndroidManifest 文件中给activity 设置lunchMode属性,android:launchMode="xxxx"。以A,B,C三个activity为例。

(1)standard模式:每启动一个Activity系统就会给它创建一个实例,这些实例以先进后出的原则被放入任务栈中。譬如在A任务栈中有A,从A中启动B,系统就会创建一个B的实例,放进A的任务栈中。此时如果再在B中启动A,系统就又会创建一个A的实例放进此任务栈中。此时栈的结构从下至上分别为1->2->3(A->B->A)。此时如果连续按返回按钮则在3位置的A先出栈,然后是2位置的B,最后是1位置的A。


Android基础 第一章 第二节Activity启动模式(笔记)_第1张图片
stamdard模式

(2)singleTop模式:栈顶复用模式。如果被启动的activity此时在任务栈栈顶,那么此activity不会被重新创建,这时此activity的onNewIntent方法被回调,生命周期为 onPause->onNewIntent->onResume。如果被启动的activity不在栈顶,那么系统就会重新为它创建一个新的实例放在栈顶。譬如在A任务栈中有A,B,C。C在栈顶,如图1-1。如果C为singleTop模式,当我们在C中启动C以后,A任务栈中仍然只有A,B,C三个activity。

Android基础 第一章 第二节Activity启动模式(笔记)_第2张图片
singleTop模式 图1-1

如果C不在栈顶,C在2的位置,这时我们在B中启动A之后,在A任务栈中就有A,C,B,C四个Activity了,如图1-2。


Android基础 第一章 第二节Activity启动模式(笔记)_第3张图片
singleTop模式 图1-2

(3)singleTask模式:栈内复用模式。这种模式下,只要在栈中有这个activity的实例系统就不会为它创建新的实例,和singleTop一样也回调它的onNewIntent的方法。上面A和C都拿来举例了也不能亏着B,假如身为singleTask模式的B被启动,启动前系统首先会寻找B需要的任务栈是否存在,如果存在则看有没有B的实例,若有则直接启动B,若没有B的实例则创建一个实例压进栈中。如果B需要的任务栈不存在则先为B创建一个任务栈(任务栈都没有,B的实例肯定也是没得了),然后创建B的实例压如栈中。举栗:

① 假如在S1栈中有A,C两个activity,我们要启动S2栈中的B,此时S2栈是不存在的,这时系统会首先创建S2任务栈然后创建B的实例压入S1栈中,如图3-1。

Android基础 第一章 第二节Activity启动模式(笔记)_第4张图片
singleTask模式 图3-1

②假如在S1栈中有A,B,C三个activity,B为singleTask模式,我们要在C中启动B,启动顺序为A->B->C->B,而我们按返回按钮返回的时候activity的出栈顺序为B->A,这是为什么嘞?因为singleTask具有clearTop的效果。简单说就是,如果本栈中有这个activity的实例,并且此实例在栈顶,那么启动这个activity的时候就不会为它创建实例,正常启动,若此activity不在栈顶则系统会把此activity上面的activity全部pop出栈,使此activity处于栈顶并启动。如图3-2


Android基础 第一章 第二节Activity启动模式(笔记)_第5张图片
singleTask模式 图3-2

(4)singleInstance模式:单实例模式。加强的singleTask模式,除了具有singleTask模式的所有特性之外,此模式下的activity只能单独的位于一个任务栈中。




参考书籍:《Android开发艺术探索》

你可能感兴趣的:(Android基础 第一章 第二节Activity启动模式(笔记))