活动的启动模式一共分为四种,分别是
standard、singleTop、singleTask、singleInstance,在
AndroidManifest.xml中通过给标签指定
android:launchMode属性来选择启动模式。
1. standard
这个是活动默认的启动的模式,Android是使用返回栈来管理活动的,每启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于此模式,系统不会在乎这个活动是否已经存在在返回栈中,每次启动都会创建该活动的一个新的实例。
首先来建立一个例子,在FirstActivity中弄一个按钮,用intent就开启FirstActivity.
从打印结果来看,每一次点击按钮,就会创建一个新的FirstActivity实例,返回栈中也存在3个FirstActivity实例,所以要连续点击三次Back才能退出程序。
2. singleTop
当活动使用singleTop模式的时候,在启动模式如果发现返回栈顶已经是该活动,则认为直接使用它,不会再创建新的活动实例。
首先修改刚刚的实例的AndroidManifest.xml中的FirstActivtiy的启动模式为singleTop,再运行同样的程序。观察结果。
发现不管点击多少次,都不会有新的打印信息,因为FirstActivity已经在栈顶了,可是现在新建一个SecondActivity,改动FirstActivity,用
FirstActivity先启动
SecondActivity,
在SecondActivity中启动FirstActivity,看结果,我这里用w打印出来的消息。
发现一个新的FirstActivity启动起来了,这是因为这个时候FirstActivity已经不在栈顶的原因。
3. singleTask
使用singleTop模式能很好的解决重复创建栈顶活动的问题,可是如果该活动没有在栈顶,还是可能创建多个活动实例的。当活动的启动模式指定为singleTask,每次启动该活动,系统就会在返回栈中检查是否存在该活动的实例,若发现已经存在则直接使用该实例,并且!把在这活动之上的所有活动全部弄出栈,当然没有发现就会创建一个新的活动实例了。
还是上面的例子,把FirstActivity的启动模式改为singleTask.
然后在
FirstActivity中添加onRestart()方法,在
SecondActivity中添加onDestroy()方法
从打印结果就能看出来,从
SecondActivity启动
FirstActivity会系统会发现已经存在了
FirstActivity实例了,而且在
SecondActivity下面,于是
SecondActivity会从返回栈中出来,然后
FirstActivity重新成为了栈顶活动。现在返回栈中只有
FirstActivity一个实例了,按一下Back键就可以退出程序。
4. singleInstance
这个模式的活动会启用一个新的返回栈来管理这个活动,这能解决共享活动实例的问题,以前做过一个项目,中间有个程序锁功能,而这个程序锁的活动,就是使用此启动模式来实现的。
现在我们将
SecondActivity的启动模式来改为singleInstance
然后修改FirstActivity中的onCreate()方法,在onCreate()方法中打印出当前的返回栈的id
然后再修改
SecondActivity中onCreate()方法,同样打印当前返回栈的id,修改点击事件,启动ThirdActivity
在
ThirdActivity的onCreate()方法中打印当前的返回栈id
可以看到
SecondActivity的Task id不同于
FirstActivity和
ThirdActivity,说明
SecondActivity确实是存在一个单独的返回栈中的,而且这个栈只有
SecondActivity一个活动。然后按返回键,会发现从
ThirdActivity直接跳到
FirstActivity,再按返回键跳到
SecondActivity,最后按下才退出程序。