activity配置属性:launchMode、taskAffinity

来源:互联网 发布:mac怎么打开ps文件夹 编辑:程序博客网 时间:2024/05/30 05:27

内容为参阅其他文章整理。

配置Activity的时,用到的两个属性:lanuchMode表示Activity的加载模式和taskAffinity表示该Activity所依附的Task的标识。

launchMode:

1、standard:默认的加载模式,表示加载一个新的Activity。如果Task的Activity的顺序是:A、B、C、D(四个的加载模式均为standard),现D启动C,则Activity的顺序是A、B、C、D、C;

2、singleTop:字面意思:只有处于栈顶时才保持single状态。当要加载的Activity配置为该模式时,当Task的Activity顺序是:A、B、C、D(其中C、D加载模式为singleTop),如果D启动D,则Activity的顺序仍是A、B、C、D,如果D启动C,则Activity的顺序是A、B、C、D、C,当Task中还没有要加载的Activity时,新建(实例化)该Activity,压入Task中;

3、singleTask:字面意思:在一个栈中保持single状态。当要加载的Activity配置为该模式时,当Task的Activity顺序是:A、B、C、D(其中B为singleTask),如果D启动B,则Activity的顺序是A、B,此时的C、D都已经被弹栈,当Task还没有要加载的Activity时,新建(实例化)该Activity,压入Task中;

4、singleInstance:字面意思:一直是single状态。当要加载的Activity配置为该模式时,新建(实例化)该Activity,会将打开的Activity压入一个新建的任务栈中。例如:Task栈1中结构为:A B C ,C通过Intent跳转到了D(D的模式为singleInstance),那么则会新建一个Task 栈2,栈1中结构依旧为A B C,栈2中结构为D,此时屏幕中显示D,之后D通过Intent跳转到D,栈2中不会压入新的D,所以2个栈中的情况没发生改变。如果D跳转到了C,那么就会根据C对应的launchMode的在栈1中进行对应的操作,C如果为standard,那么D跳转到C,栈1的结构为A B C C ,此时点击返回按钮,还是在C,栈1的结构变为A B C,而不会回到D。Activity配置为singleInstance时,会一直保持该Activity所在Task只有该Activity一个Activity存在,这个现象结合taskAffinity属性表现的更加明显。

关于singleInstance的一个结论:lanuchMode配置为singleInstance的Activity所在的Task只有该Activity一个Activity,不会有其他Activity。比如有三个Activity,他们的配置和启动关系如下:

Activity1------------------------------>Activity2---------------------->Activity3

singleInstance                                 默认                                singleInstance

运行发现Activity所在的Task的ID为97,Activity2所在的Task的ID为98,Activity3所在的Task的ID为99(ID根据不同的运行,会出现不同的结果)。即三个Activity的Task是不同的,也就是说singleInstance的Activity启动默认的Activity,会新启动一个Task,singleInstance的Activity所在的Task只有该一个Activity,默认的Activity启动singleInstance的Activity也会启动一个新的Task。

taskAffinity:

表示该Activity所依附的Task的标识,即新建(实例化)的Activity要压入哪个栈中。

配置Activity时如果没有配置该属性,则默认为该Activity所在的application配置的该属性,如果application也没有配置该属性,则默认为应用的包名。

Task也存在该属性,即为根Activity的taskAffinity(第一个压入该栈的Activity)。

新建(实例化)一个Activity,该Activity会首先寻找是否有已经存在相同taskAffinity,如果存在,则在该Task中新建(实例化)该Activity,但是在singleInstance时例外,下面就结合launchMode和taskAffinity对每种情况做介绍:

application       Activity                taskAffinity

app1                 Activity1              com.lyc.demo.test(和包名不同)

app1                 MainActivity       不配置, 默认包名

app2                 Activity2              com.lyc.demo.test

1、standard:如果已经存在相同taskAffinity的Task,则在该Task中新建(实例化)Activity,如果不存在,则新建一个栈,在该栈总实例化,例如:在上述前提下app1中MainActivity启动Activity1,会为Activity1新建一个栈(不同于MainActivity所在栈,可以通过getTaskId()方法取得加以区别),在该栈中实例化。

2、singleTop:如果已经存在,则看该栈中是否已经存在实例化的该Activity实例,如果存在,则看是否在栈顶,如果在栈顶,则栈内Activity顺序不变,如果不在栈顶,则在该栈中新建(实例化)该Activity,如果该栈中不存在实例化的该Activity实例,则在该栈中新建(实例化)该Activity。如果不存在相同taskAffinity的栈,则新建Task,再在该栈中新建(实例化)该Activity。

3、singleTask:如果已经存在,则看栈中是否已经存在实例化的该Activity实例,如果存在,那么销毁在该Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈。如果不存在相同taskAffinity的栈,则新建Task,再在该栈中新建(实例化)该Activity。

4、singleInstance:如果存在,则看栈中是否已经存在该Activity实例,如果不存在该Activity实例,则为该Activity新建Task,并在新建的Task中新建(实例化)该Activity。如果存在的Task已经存在该Activity的实例,则调用该Activity的onNewIntent。如果不存在相同taskAffinity的栈,则新建Task,再在该栈中新建(实例化)该Activity。


-----------------------------------------------------------------------------------------


对于启动Activity通常使用Intent,Intent的属性flag可以设置控制启动Activity的方式。具体可以参见《疯狂Android讲义》相关章节。

0 0
原创粉丝点击