启动模式
在AndroidManifest.xml文件中给<activity>标签指定 android:launchMode 属性来设置启动模式
standard
singleTop
singleTask
singleIntance
standard
默认的启动模式
每启动一个新的活动,他就会从返回栈中入栈,并处于栈顶的位置
对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈汇总存在,每次启动都会创建该活动的一个新的实例
standard demo:
我们在FirstActivity的基础上再启动FirstActivity,并两次点击按钮
1 | protected void onCreate(Bundle savedInstanceState) { |
发现需要点三次BACK才能返回桌面
singleTop
当启动活动时发现返回栈的栈顶已经是该活动,则直接使用,不再创建新的活动。
还是上面的例子,这次将活动的启动模式设置为singleTop
1 | <activity |
连续点击3次会发现只打印了1次
不过当Activity并未处于栈顶位置时,这时再启动Activity,还是会创建新的实例
singleTask
让某个活动在整个应用程序的上下文中只存在一个实例,每次启动该活动时,系统首先会在返回栈中检查是否存在该活动的实例,若发现已经存在,则直接使用该实例,并把该活动之上的所有活动统统出站,若没有发现,则会创建一个新的实例
下面将Activity1的启动模式设为singleTask,并在Activity1中复写onRestart()方法,在Activity2中复写onDestroy()方法,从Activity1跳转到Activity2并返回Activity1,观察log输出
1 | <activity |
会发现,一开始创建了一个MainActivity的实例,跳转到活动2并返回后,发现调用了Activity1的restart,和Activity2的onDestroy方法
singleInstance
指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动
做一个简单demo,将Activity2的启动模式设置为singleInstance,activity1和Activity3为默认的启动模式,在每个活动中都用getTaskId()获取并打印出自己所在的返回栈的ID,首先启动Activity1,然后从Activity1跳转到Activity2,再从Activity2跳转到Activity3,再点击返回键BACK,观察log输出
通过日志可以发现,Activity2的确用了一个新的返回栈来处理,Activity1和Activity3的返回栈id是一样的,说明是同一个返回栈,并且在Activity3点击BACK返回时,会发现到了Activity1,在Activity1中点击返回,到了Activity2页面。也就是说,只有一个返回栈空了,才会转到另外一个栈