Activity的启动模式

1、Activity的LaunchMode

(1)standard:标准启动模式。每次启动一个Activity都会重新创建一个Activity并且符合典型的Activity的生命周期。一个任务栈可以多个Activity实例,哪一个Activity启动新的Activity,新的Activity和启动它的Activity是同一个任务栈。如果没有任务栈的Context
启动Activity就会crash,这时在启动Activity的Intent上指明FLAG_ACTIVITY_NEW_TASK标示。

(2)singleTop:如果新的Activity已经位于任务栈的栈顶,那么Activity不会被创建,但会调用它的onNewIntent方法。如果Activity的实例已经存在但是没有在栈顶,那么Activity还是会被重新创建。

(3)singleTask:栈内复用模式。只要Activity在同一个任务栈,那么调用多少次启动这个Activity都不会被重新创建,系统会回调onNewIntent方法。并且将位于此Activity的前面的Activity移出任务栈。如果不在同一栈内,会先创建新的任务栈,再把Activity实例放入任务栈。

(4)singleInstance:单例模式。此模式拥有singleTask的一切特性外,还拥有此模式的Activity只能位于独立任务栈中。

2、补充点:

(1)指定Activity的任务栈。在Activity配置中添加TaskAffinity的属性值,默认情况下是应用的包名,所以想要自定义这个属性值就必须与包名不同。TaskAffinity和singleTask或者allowTaskReparenting属性配对使用,在其他情况下没有意义。

(2)当TaskAffinity和allowTaskReparenting结合的时候,当应用A启动了应用B的某个Activity后,如果Activity的allowTaskReparenting属性值为true的话,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈。

(3)Activity的两种启动模式的指定方式:
第一种通过AndroidMenifestActivity指定启动模式:


第二种通过Intent中设置标志位来为Activity指定启动模式

Intent intent = new Intent();
intent.setClass(MainActivity.this,Second.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

这两种方法都可以指定Activity的启动模式,但是有区别的。首先,优先级第二种高于第一种,当两种同时存在时以第二种为准。其次它们的限定范围不同,第一种无法直接指定FLAG_ACTIVITY_NEW_TASK,第二种也无法指定singleTask模式。
第二种的常见的启动模式有:

FLAG_ACTIVITY_NEW_TASK

这个标示是为Activity指定singleTask启动模式

FLAG_ACTIVITY_CLEAR_TOP

它会将位于任务栈上面的任务都顶出栈。如果和singleTask一起使用,如果被启动的Activity已经存在,那么系统只会回调onNewIntent方法。如果Activity是standard模式启动,那么会连同它和它之上的Activity都会出栈,系统会创建新的Activity实例并放入栈顶。

FLAG_ACTIVITY_SINGLE_TOP

这个标示是为Activity指定singleTop启动模式

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

具有这个标识的Activity不会出现在历史Activity的列表中。等同于

android:excludeFromRecents="true"

你可能感兴趣的:(Activity的启动模式)