Android Activity四种启动模式结论篇

来源:互联网 发布:linux vsftpd 安装 编辑:程序博客网 时间:2024/06/08 16:49

明确一个task任务栈的概念,task是一组以栈的模式聚集在一起的Activity组件集合,存在于一个back stack的数据结构中,有潜在的前后驱动关联,是Android巧妙用于控制在一个应用中打开另一个应用时界面的跳转与返回,使得跨应用的跳转流畅。

如果我们没有设置任何启动方式的话,安卓会默认采用第一种标准模式,即standard,他会创建多个实例,并且用类似栈的方式,先进后出,依次放入任务栈中。这种情况下,系统会创建许多的实例,back一次,才会回收栈顶的Activity,直到任务栈空,这种方式对系统有很大的负担,且很多时候,我们希望去改变进出栈的顺序,这就有了其他三种启动方式。值得注意的是,在standard启动模式下,Activity是被谁启动的,它就属于启动它的那个Activity所在任务栈。

假设APK1有AB两个Activity,APK2有C一个Activity,都设置为standard,则在A→B→C的跳转中,他们的task号一致。

启动模式的设置为:在活动清单AndroidManifest.xml中为活动添加如下属性

<activity

     android:name=".TestActivity"     android:launchMode="singleTask">    </activity>

SingleTop

如果将activity  B的启动模式设置为singleTop,那么,当B被启动时,它首先会去查看,栈顶的Activity是否为B,如果是,那么,他就会直接使用,Activity的Oncreate,OnStart,OnResume方法都不会被调用,相当于原样拿来。而如果不是B,那么它就会重新创建实例。


SingleTask

这里首先声明一个知识点,每一个activity都有一个TaskAffinity属性,指明了它所期望去的task,如果没有在manifest中显式得表明出来,那么该属性就想默认和Application的TaskAffinity一致,如果application也没有指明的话,那么该属性值默认为包名。Task本身也有该属性,它的值默认为它根activity的TaskAffinity值。

那么,设置了“singleTask”启动模式的activity将会有下面两个特点:

1、设置了“singleTask”启动模式的activity,在启动时,会在系统中查找属性值affinity等于它的属性值的任务,如果存在的话,它就会在原有的task中启动,如果没有,它就会在新的task中启动。如果想主动使activity在新任务中启动,只要将singleTask启动模式的activity的taskaffinity属性设置一下。

举个例子:一个APK1,有A,B,C三个活动,另一个APK2,有D,E两个活动,如果设置跳转顺序为A→B→C→D→E,即发生由APK1跳转至APK2的情况。如果此时,设置D活动的启动模式为singleTask,由于我们没有设置过taskAffinity属性,该属性默认A,B,C为APK1的包名,D,E为APK2的包名,在启动D时,D去查找前面系统中affinity和他一致的task,但显然APK1的task和他不一样,所以此时,APK2虽然是由APK1带起来的,但仍然会有一个新的task被创建。

2、如果D是在同一个任务中启动的话,那么此时,D会先去查看任务栈底部有没有已经启动的D,如果有,就会把D之上的所有活动销毁,如果没有,就新实例。

比如:APK1,有ABCD活动,其中,D设置成了singletask,循环启动,即A→B→C→D→A,在下一次启动到D之前,从任务栈底到栈顶应该是A,B,C,D,A,B,C,但此时,继续向后,D发现,在任务栈中,存在已有的D,那么,D之上的全部销毁,D再次复用,顺序就成为A,B,C,D。


SingleInstance

如果一个Activity设置为SingleInstance,那么意味着该Activity独立运行于一个task,且整个android系统中只有这一个实例,再次跳转到这个activity也只会复用。

这种模式有几个特殊之处,假设有一个APK1,有ABCD四个活动,其中C被设置成SingleInstance,首先,C的Task一定是和ABD不一样的。其次,在入栈时,A,B,入task1,此时,跳转到C,C会独立创建一个Task2,跳转D时,D又会被压入task1。在执行back操作时,先执行销毁当前task内所有活动,如现在在D,就会先销毁D,再销毁B,再A,最后来到task2,销毁C。

第二个情况是,如果APK1有A,B两个活动,APK有C,D两个活动,跳转顺序为A→B→C→D,C被设置为SingleInstance,假设APK1的两个活动所在task号为110,那么C的为111,再跳转D时,D的task会变成112,即也不会回到APK1的任务栈。

原创粉丝点击