要了解activity的启动模式,必须首先明白task和back Stack的概念
官方API中Task定义如下:A task is a collection of activities that users interact with whenperforming a certain job.意思是当完成某种功能时,与用户交互的一组活动的集合。
Back Stack的定义如下:The activitiesare arranged in a stack (theback stack), inthe order in which each activity is opened.意思是打开的活动都被放入一个栈中(返回栈),次序就是每个活动被打开的先后次序。而且back stack中的activity顺序不得调整,遵循后进先出的原则,谁处于栈顶,谁先出栈。
Task和backStack通常共同存在,每打开一个activity,就放入栈中,处于栈顶的activity就是在屏幕上可见的activity,即处于前台(foreground),位于栈中的其他activity就处于后天运行(background)。通俗地说,你在屏幕上能看到的那个activity一定是处于栈顶的,而要想弄明白你总共打开可多少acticity,那你可以不停按back键盘(就是模拟器上的那个三角按钮)。几次可以退出程序,就是创建了几个activity.
弄明白了上述问题,我们再介绍activity的启动模式(launchemode),一共有四种启动模式,即standard、singleTop、singleTask、singleInstance.这些模式可以在AndroidManifest.xml中配置。
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second"
android:launchMode="standard">
</activity>
(1)standard:
默认启动方式。每打开一个activity,都会创建一个此activity的实例,一个activity可以被实例化多次,每个实例可以分属于不同的任务,一个任务可以有多个实例。
如果选择了此种模式,无论什么时候,启动一个activity都会重新创建一个实例,放入back stack中,不管back stack中是否有此实例。
此图中启动顺序是:first activity启动second activity , second activity启动third activity ,third activity再启动first activity,这时尽管back stack中已经有一个first activity,但是当third activity再启动first activity时,依然创建可新实例,而且与处于栈底的那个first activity实例无关。
这时通过点击四次back键,才能退出程序,因为back stack中有四个activity。
(2)SingleTop
如果某个activity设置的启动模式是singleTop,当启动此activity时,如果此activity已经在栈顶,则不创建此activity的实例,否则就创建实例,保证此activity处于栈顶(on the top of the back stack).
设置Activity C为SingleTop,A启动B,B启动C,C启动C,由于C已经处于栈顶,所以当C启动C时,不会创建新实例,按返回键也是三次退出程序
设置B为singleTop,A启动B,B启动C,C启动B,由于B不在栈顶,所以依然会创建B的一个实例并置于栈顶,按back键,四次退出程序
(3)singleTask
当设置某个activity启动模式为singleTask时,启动此activity,如果此activity在back stack中不存在,则创建此activity的实例;如果此activity已经处于栈顶,则不创建新的实例,也将其他的activity弹出back stack;如果此activity不处于栈顶,但是已经存在于back stack中,则将位于其上的activity全部弹出栈,保证此activity处于栈顶。
设置D为singleTask,启动D时,由于D已经已经处于栈顶,则不创建新的实例,也不会将其他的A、B、C弹出back stack
设置B为singleTask,A启动B,B启动C,C启动D,D启动B,第一次由于Back Stack中没有B,所以会创建,第二次启动B,由于B不处于栈顶,但是已经存在于back stack中,则将位于其上的C、D全部弹出栈,保证此B处于栈顶。
(4)SingleInstance
设置某个Activity启动模式为singleInstance。则启动该activity时,它会创建一个新栈,并且新栈中有且仅有它一个。出栈时,先将前台栈中的Activity弹出,再将此栈中的此activity弹出。