Activity启动模式一共四种
- standard
- singleTop
- singleTask
- singleInstance
一共四种。
怎么修改 activity 的启动模式
在清单文件中 的 activity 的标签中添加属性:
android:launchMode="启动模式"
activity stack:activity栈
android 中的 activity 的启动是受activity栈所管理的,因为存在 activity 栈,所以启动模式才有意义
standard模式
activity 的默认模式,即不给 activity 设置上面的 launchMode属性,就会按照默认的启动模式启动
特点
启动一个 activity ,就会往 activity栈中添加一个实例,比如activity A 跳转到B ,B 跳转到C ,C 跳转到D,D 跳转到A ,A 跳转到B
那么,在activity栈 内就会 从底到顶排列ABCDAB
懒得画图:
B
A
D
C
B
A
这样样子的,那么栈的特性是 “后进先出”,所以当我们在这个时候点击返回键的时候,B A D C B A 依次退出,最终 程序退出
singleTop 模式
按照上方所说的,我们在清单文件中添加
activity:lauchMode="singleTop"
就可以让当前的Activity设置成为 singleTop模式
特点
singleTop模式:在创建实例时,如果当前实例在Activity栈的栈顶,那么新的实例将不会创建,而是会复用栈顶的这个实例,此时会调用这个栈顶实例的 activity中的 onNewInstance()方法。
举个例子,现在activity C是 singleTop 模式,A B是普通模式
那么现在 A跳转到B ,B跳转到C,C再跳转到C
这个时候,在C 跳转到C的时候 ,新的C 不会再创建,而是会复用当前的C ,并且调用C里面的onNewIntance()方法
activity栈的模式就是这样的
C
B
A
但是如果相同的案例,如果ABC都是standard模式,那么
activity栈的模式就是
C
C
B
A
singleTask模式
按照上方所说的,我们在清单文件中添加
activity:lauchMode="singleTask"
就可以让当前的Activity设置成为 singleTask模式
特点
在创建实例时,会在activity栈内 遍历一遍,看看是否有当前activity的实例,如果有,则复用,并且把其他在这个实例上面的 activity实例退出
。如果没有,则会创建一个新的实例并进入到这个activity栈中
举个例子
现在activity A是 singleTop 模式,B C是普通模式
现在点击A 跳转B ,B跳转到C,C再跳转到A,那么在Activity栈中是这样的过程
A跳B:
B
A
B再跳C:
C
B
A
再从C跳到A:
A
singleInstance模式
按照上方所说的,我们在清单文件中添加
activity:lauchMode="singleInstance"
就可以让当前的Activity设置成为 singleInstance模式
特点
在创建singleInstance实例的时候,会重新开启一个activity栈,并且将该实例放到这个栈中。
举个例子
C是SingleInstance模式
现在A跳到B,B跳到C,那么A和B 会在一个activity栈,而在B跳转到C的时候,由于C是singleInstance模式,所以会开启一个新的activity栈:
所以此时,activity栈会是这个样子的
第一个栈:
B
A
第二个栈:
C
总结
一般我们只是用standard模式。