Android的启动模式分为以下四种:
其中“standard”为activity的默认启动模式。
直接在AndroidManifest.xml中的对应的activity中添加“android:launchmode”字段即可。如下:
<activity
android:name=".BActivity"
android:launchMode="standard"/>
launchMode决定了是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他的Activity实例放在同一个task任务栈里。
task任务栈是一个具有栈(决定了其先进后出的特性)结构的容器,可以用来放置多个activity的实例。当我们启动一个应用的时候,系统就会为之创建一个task,来存放根Activity。
举个例子,AActivity(根Activity),BActivity,CActivity其启动模式都为standard。此时进入应用,启动AActivity,然后在AActivity中启动BActivity,最后在BActivity中启动CActivity。整个流程精简成:A->B->C。task任务栈变化如下图:
这是Activity的默认启动模式。新建的activity实例直接放入task任务栈,无论该activity实例是否在栈中。
举个栗子: A,B,C,D都是standard模式。
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布为:(ABCD),如图2.1。
(2)、如果Activity的操作顺序:A->A->A,则task任务栈内的分布为:(AAA),如图2.2。注:A->A时,新的A会从onCreate执行。
如果该Activity实例已经在task任务栈栈顶了,那么就会重用这个栈顶的Activity实例(此时调用onNewIntent()方法),不会再重新去实例化Activity对象
举例: A,B,C,D都是singleTop模式。
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布为:(ABCD),如图3.1。
(2)、如果Activity的操作顺序:A->B->A->C,则task任务栈内的分布为:(ABAC),如图3.2。注:A->B->A时,此时A仍旧从onCreate开始。
(3)、如果Activity的操作顺序:A->B->A->A,则task任务栈内的分布为:(ABA),如图3.3。注:A->B->A时,此时A从onNewIntent开始,A->B->A->A时,此时A从onNewIntent开始
如果该Activity实例已经存在task任务栈中,那么就会重用该Activity的实例(此时调用onNewIntent()方法),并清除该activity实例到栈顶之间的所有activity实例。因此该activity在task容器栈中永远只有唯一实例对象,不会存在两个相同的实例对象。
举例: A,B,C,D都是singleTask模式。
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布为:(ABCD),如图4.1。
(2)、如果Activity的操作顺序:A->B->A->C,则task任务栈内的分布为:(AC),如图4.2。注:A->B->A时,此时A仍旧从onNewIntent开始。
(3)、如果Activity的操作顺序:A->B->A->A,则task任务栈内的分布为:(A)。
这种launchMode会启用一个新的task任务栈,并保证不再有其他的Activity实例进入。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个该Activity,不管谁激活该Activity都会进入同一个栈中。
举例: A,C,D都是standard模式,B是singleInstance模式
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布如图5.1。
A->B:因为B是singleInstance启动模式,所以此时会新建一个task任务栈来存放B的实例
A->B->C:因为C是standard模式,此时C的实例push到A所在的任务栈
A->B->C->D:因为D是standard模式,此时D的实例push到A所在的任务栈。此时,在D界面按返回键退出到C,再按返回键退出到A,再按返回键退出到B,再按返回键退出应用。
(2)、如果Activity的操作顺序:A->B->C->B,则task任务栈内的分布如图5.2。
A->B->C->B:因为B是singleInstance模式,并且B的实例已经存在,直接重用已存在的B的实例(调用onNewIntent())。此时在B界面按返回键退出到C,再按返回键退出到A,再按返回键退出应用。
launchMode | standard | singleTop | singleTask | singleInstance |
---|---|---|---|---|
是否需要新建task任务栈 | 否 | 否 | 否 | 是 |
是否允许task任务栈中存在多个该Activity的实例 | 是 | 是 | 否 | - |
是否允许多个相同Activity的实例叠加 | 是 | 否 | 否 | - |
注:singleInstance模式的Activity的实例在所有task任务栈中有且之存在一个实例。