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指定启动模式:

<activity
       android:name="com.xxx.activity"
       android:configChanges="screenLayout"
       android:launchMode="singleTask"/>

第二种通过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"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容