Activity启动模式,了解下?

关于Activity的启动模式的应用,在平时的开发中我们可能不是很常见,但是这块的知识点确是很重要,因为它涉及到Activity的创建,所以我们很有必要了解,掌握一下!

Activity的启动模式分为四种:

1. standard
标准模式,是一种多实例实现,系统默认的开启activity的模式。
在此启动模式下,每次开启一个activity,不管这个activity在所需要的栈中是否存在实例,都会创建一个activity实例,压入所需任务栈中(关于所需任务栈这个概念,我们后文单独开一段介绍)。当连续按back键返回时,任务栈中的activity会依次出栈,直到栈为空,系统自动回收这个任务栈。
一个任务栈中可以有某个activity的多个实例,每个实例可分属不同的任务栈。谁启动了这个activity,那么这个activity就会被压入启动它的activity所在的任务栈。当你用一个非Activity的context(如ApplicationContext)去启动一个activity时会报错,因为非Activity的context没有所谓的任务栈。

2. singleTop
栈顶复用模式。
当要开启的activity在所需任务栈中存在实例,且存在的实例位于栈顶时,不会创建这个activity的新实例,会复用栈顶的实例,当activity被复用时,会回调activity的onPause,onNewIntent,onResume,只是暂停了一下,回调onNewIntent,然后又继续。可以在onNewIntent回调里面拿到传递过来的信息。除此之外的其他情况,都会创建一个新的实例压入任务栈。
例:要开启Activity C,开启前所需任务栈中从栈底到栈顶的activity依次是:ABC,那么,在开启后,任务栈中activity依然为:ABC;如果开启前所需任务栈中从栈底到栈顶的activity依次是:ACB,那么开启后,任务栈中activity就变为:ACBC。

3. singleTask
栈内复用模式,具有栈顶清空特征,是一种栈内单实例实现。
如果要开启的activity的所需任务栈中已存在该activity的实例,会复用已存在的这个activity,回调该activity的onPause,onNewIntent,onResume,并将栈中位于该activity之上的activity出栈(栈顶清空);如果要开启的activity的所需任务栈不存在,则创建任务栈,创建该activity的实例并压入所需任务栈。
例1:要开启的activity D所需任务栈名为:task1,task1刚好存在,其栈内从栈底到栈顶activity依次为:ABDC,则开启D后,task1内activity分布变为:ABD;
例2:要开启的activity D所需任务栈名为:task2,task2不存在,则创建task2,创建D的实例并压入task2任务栈中。

4. singleInstance
全局单实例模式,是singleTask plus,具有该启动模式的activity,只能单独位于一个栈中。
当要开启的Activity没有已存在的实例,那么就创建一个任务栈,创建一个实例并压入刚创建好的任务栈;如果要开启的Activity有实例存在,就复用,并回调实例的onPause,onNewIntent,onResume

那么之前一直说的Activity的所需任务栈到底是个什么东西呢?
这要提到一个参数:TaskAffinity,可以理解为任务相关性。这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有activity的所需任务栈名为应用包名。当然可以为每个activity指定单独的TaskAffinity属性,属性值为字符串,且中间必须有包名分隔符 “.”,且这个属性值不能与包名相同,不然就相当于没有指定。
例:android:taskAffinity="com.zb.task"
提到TaskAffinity,就不得不提allowTaskReparenting这个属性,我们来看下两者结合使用时会产生什么效果。应用A的activity X 启动了应用B的activity Y,Y的allowTaskReparenting设置为true,当Y启动后,Y会从应用A的任务栈直接转移到应用B的任务栈中,这时退到桌面,点击应用B的应用图标,会直接显示刚刚开启的Y,而不是应用B的主activity。

Activity的Flags
可以通过标志位来设置activity的启动模式,常见的几种有:

1.FLAG_ACTIVITY_NEW_TASK
这个标记位是为activity指定singleTask启动模式。

intent.addFlags(Intent. FLAG_ACTIVITY_NEW_TASK)

2.FLAG_ACTIVITY_SINLE_TOP
这个标记位是为activity指定singleTop启动模式。

intent.addFlags(Intent. FLAG_ACTIVITY_SINLE_TOP)

3.FLAG_ACTIVITY_EXCLUDE_RECENTS
具有这个标记位的activity不会出现在历史activity的列表中,它等同于在xml中设置:

android:excludeFromRecents="true"

猜你喜欢

转载自blog.csdn.net/qq_15692039/article/details/80637515