Activity启动模式:launchMode 和 Intent中设置标志setFlags

Activity指定启动模式有两种:

(1)通过清单文件AndroidManifest设置launchMode属性

 <activity android:name=".MainActivity"
           android:launchMode="singleTop"/>

(2)通过在Intent中设置标志

Intent i = new Intent(context, MainActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
        Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);

两者启动模式不同,
第二种的优先级高于第一种,当两种同时存在时,会以第二种为准;
两种限定范围不同,第一种无法直接为Activity设置FLAG_ACTIVITY_NEW_TASK 这种标识,第二种不能给Activity指定standard模式

现在先说 清单文件AndroidManifest设置launchMode属性:有四种启动模式

standard:标准模式

系统默认的启动模式。
每启动一个activity都会重新创建一个实例,不管这个实例存不存在;
一个任务栈中可以有多个相同实例;
谁启动这个activity,它就会入启动它的activity所属的栈中;

注意:当我们用ApplicationContext 去启动standard模式的Activity时,会报错:
这里写图片描述
是因为standard模式的Activity默认会进入启动它的Activity所属的栈中,但是非Activity类型的Context(如ApplicationContext )并没有所在的任务栈,所以会报错;
解决方法为:为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动就会为它创建一个新的任务栈。这个时候待启动的Ativity实际上是以singleTask模式启动的。

singleTop:栈顶复用模式

(1)新Activity位于任务栈的栈顶,那么此Activity就不会被创建,
Activity的onCreat和onStart不会被调用,但是会调onNewIntent方法,接着调用onResume就继续了。
(2)新Activity已存在但是不位于任务栈的栈顶,那么会重新创建新Activity。

singleTask:栈内复用模式(单实例模式)

系统会先找是否存在   新Activity想要的任务栈,如果没有,就会创建一个新的任务栈,将新Activity入栈;如果有:
(1)新Activity在任务栈中存在,系统会把该Activity实例调到栈顶,栈内所有在该Activity实例前面的Activity出栈,
多次启动该Activity都不会被创建,Activity的onCreat和onStart不会被调用,但是会调onNewIntent方法。
(2)新Activity在任务栈不存在,那么会重新创建新Activity入栈。

singleInstance:单实例模式

它具有singleTask模式的所有特性,此模式的Activity只能单独位于一个任务栈中

例如: Activity A 是singleTask模式,当A启动后,如果没有这个A独占的任务栈,系统就会创建一个新的任务栈,A独自在这个任务栈中,由于栈内的复用性,下次开启A 就不会再创建任务栈了。

通过在Intent中设置标志

我们来介绍下常用的标识 flags

FLAG_ACTIVITY_NEW_TASK :为Activity指定“singleTask”启动模式,其效果和在XML中指定启动模式一样
FLAG_ACTIVITY_SINGLE_TOP :为Activity指定“singleTop”启动模式,其效果和在XML中指定启动模式一样
FLAG_ACTIVITY_CLEAR_TOP :当Activity启动时,在同一任务栈中所有位于它上面的Activity都要出栈。这个模式需要和FLAG_ACTIVITY_NEW_TASK 配合使用,被启动Activity实例如果已经存在,系统就会调用它的onNewIntent.
FLAG_EXCLUDE_FROM_RECENTS :此Activity不会出现在历史Activity列表中,不希望用户通过历史列表回到Activity。其效果和在XML中指定Activity的属性:android:excludeFromRecents=”true” 一样
我们一般用在主Activity上,这样退出App,历史列表里就没有此App了
如图所示:
Activity启动模式:launchMode 和 Intent中设置标志setFlags_第1张图片

你可能感兴趣的:(Android,基础)