活动的启动模式分为:standard、singleTop、singleTask、singleInstance四种。
standard模式
是活动默认的启动模式,是在学习活动跳转时最先接触的模式。这个启动模式无视栈顶的活动,在实现Intent跳转后就会创建一个新的活动(即使是同一个活动)。例如:
Intent intent=new Intent(FirstActivity.this, FirstActivity.class);
startActivity(intent);
当你在FirstActivity点击触发跳转时,将会有一个新的FirstActivity被创建。持续点击触发跳转则会在返回栈中持续堆叠FirstActivity活动。
singleTop模式
修改上一个案例中的AndroidManifest.xml中FirstActivity的启动模式,添加:android:launchMode=”singleTop”。再次运行,你点击触发跳转时将会发现,FirstActivity活动不会再被创建,因为此时FirstActivity已经位于返回栈的栈顶。这就是singleTop启动模式的特点:当你想要启动的活动位于目前返回栈的顶部时,将不会重新创建新的活动,而是使用栈顶的活动,因此FirstActivity也只会有一个实例。不过如果你想启动的活动不位于目前返回栈的顶部的话,还是与standard模式相同,创建一个新的实例,所以这也是singletop的一个问题,singleTask的出现就可以解决这个问题。
singleTask模式
当活动的启动模式指定为singleTask时,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例。如果存在,则直接使用该实例。由于栈后进先出的特性,假如该活动的上面还存在其他实例,在使用该活动的时候会让该活动上的其他活动统统出栈。如果不存在,那么就创建一个新的活动实例。
singleInstance模式
singleInstance是这四种启动模式中最特殊也最复杂的一个模式。singleInstance适用于那些其他程序调用这个程序活动的情况。因为每个程序都有自己的返回栈,同一个活动在不同的返回栈中入栈事必然会创建新的实例,使用singleInstance模式就会有一个单独的返回栈来管理这个活动,无论哪个程序来使用,都会共用同一个返回栈,解决了多程序共享的问题。例如,目前有A、B、C三个活动,其中B活动的启动模式为singleInstance,A、C为默认的standard模式。活动的跳转流程为A->B->C。当你完成从A到C的跳转后,在C界面按下Back键,会发现C返回到了A,再点击Back键,A返回到了B。这就说明,A与C在同一个返回栈中,A入栈后,C进入同一个栈。而B进入了另一个栈。所以C返回到了A,然后在A界面点击Back时,因为此时A所在的栈已空,所以就显示另一个栈的栈顶——也就是B所在的栈,于是B显示出来。此时再点击Back键,所有实例都出栈,程序也就自然退出了。