Activity四种启动模式(standard,singleTop,singleTask,singleInstance)

Activity一共有以下四种launchMode: 
1.standard

2.singleTop

3.singleTask

4.singleInstance

启动模式在mainfest.xml里面的activity里面配置,如下图launchMode所示: 

一,前提:Android对于Activity的管理方式

Android采用Task来管理多个Activity.当启动一个APP时,Android就会为之创建一个Task,然后每启动一个activity,则把当前的activity压到栈顶。比如以此启动页面A->B->C,栈里面的结构如下所示:

按返回键的时候,从栈顶弹出页面依次为C->B->A

二,四种启动模式

1)standard

扫描二维码关注公众号,回复: 4269372 查看本文章

standard模式是默认的启动模式,不用为配置android:launchMode属性即为standard模式,当然也可以指定值为standard。 
默认的启动模式比较简单,我有三个页面A,B,C,以此启动页面A->B->C,则在此模式下,栈里面从栈顶到栈底依次为C-B-A,如下所示

如果此时按返回键,则页面退出顺序为C->B->A,其实为简单的栈操作,先近后出。

2)singleTop 
当启动activity启动模式为android:launchMode=”singleTop”时。 
1.比如Activity B启动模式为singleTop,Activity A为standard,此时从A页面跳转B页面,A->B时,会先在栈中查看栈顶是否存在B,存在的话,则复用栈顶B,调用onNewIntent方法,而不是重新new一个新的B。如果栈中不存在B,则会创建B。

2.再继续从B页面跳转B页面的时候,及A->B->B时,因为栈顶已经存在B了,则直接复用栈顶的B,调用onNewIntent方法,此时栈如下所示:

3)singleTask 
当启动activity启动模式为android:launchMode=”singleTask”时,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。 
比如Activity A启动模式为singleTask,Activity B为standard,Activity C为standard,此时A->B->C,则栈为

接下来,继续跳转A,则A->B->C->A,因为此时A的启动模式为singleTask,发现栈中已经存在A,则会先把C,B出栈,然后再复用A,调用A的onNewIntent方法,此时,栈中只剩下A。

4)singleInstance 
这种启动模式比较特殊,因为它会启用一个新的栈结构,将使用singleInstance的Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。 
比如Activity A启动模式为standard,Activity B为singleInstance,从页面A,跳到页面B,A->B,则会出现两个栈,如下:

此时按返回键,则,退出顺序为:B->A 
比如Activity A启动模式为standard,Activity B为singleInstance,Activity C启动模式为standard,页面跳转为A->B->C,则会出现两个栈,如下:

此时按返回键,则,退出顺序为:C->A->B,为什么会回到B页面呢,那是因为B跳转C的时候,我们的起点变成了B实例所在的栈结构,这样,我们需要回归到这个栈结构中来。

可能singleInstance你还没有理解,我再举个常见的例子。 
比如Activity A启动模式为singleInstance,同时A也是入口activity,也是其他应用调用的activity(多个应用互相启动的场景)。 
当我们从其他应用打开Activity A的时候,A会单独存在一个栈中,如果我们打开当前应用,则无需创建新的A实例即可看到结果,因为系统会自动查找,存在则直接利用。
 

猜你喜欢

转载自blog.csdn.net/qq_39140779/article/details/84145660