Activity启动模式

Posted 加冰雪碧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity启动模式相关的知识,希望对你有一定的参考价值。

据我们所知Activity有多种启动模式,各种启动模式启动所带来的行为是不同的,据官方文档所说,在manifest文件<activity>元素中可以设置如下几个属性:

taskAffinity

launchMode

而在Intent中,有如下几个FLAG是比较常用的:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_SINGLE_TOP

下面就来看一下这些属性和FLAG的设置会影响到Activity的什么行为

Activity的启动模式

有两种方法可以定义Activity启动模式,在manifest文件中定义和使用Intent的FLAG定义,这两种定义模式各有各的不同,但是在两者同时存在的时候以Intent中定义的启动模式为准。

manifest文件中定义:

当在manifest文件中定义Activity的时候,可以通过设置<activity>标签下的launchMode属性来设置当前Activity的启动模式,有如下几个可选项

1.standard(标准模式):

standard模式是系统默认的启动模式。每次启动一个Activity都会创建出一个新的实例,在一个任务栈中可以有多个Activity的实例。以这种模式启动的Activity将会在启动它的Activity所在的任务栈中,不可以用ApplicationContext去启动standard模式的Activity,不然会出现异常,因为ApplicationContext没有自己的任务栈。

2.singleTop:

栈顶复用模式。如果启动的Activity在当前任务栈的栈顶,那么不会重新启动,只会调用Activity的onNewIntent方法,但是如果启动的Activity不在当前任务栈的栈顶,将会创建新的实例,所以说以这种模式启动的Activity也会在同一个任务栈中存在多个实例。

3.singleTask:

当一个Activity以这种模式启动时,系统会寻找这个Activity的相关任务栈,如果这个任务栈存在,就会检查任务栈中是否有这个Activity的实例,如果有,就不会创建Activity,如果没有则会创建出这个Activity并入栈。如果这个Activity的相关任务栈不存在,则会创建出一个任务栈,并且将Activity放到新的任务栈中。

上面提到的相关任务栈是什么呢?以下是官方文档的一些介绍:

如果在Intent中加入了一个FLAG_ACTIVITY_NEW_TASK flag或者在manifest文件中配置的启动模式是singleTask的话,系统将检查当前任务栈的affinity和该Activity设置的affinity是否相同,如果相同则会把它放到当前的任务栈中,如果不同将会创建一个新的任务栈,默认情况下Activity的affinity为当前应用的包名。

有一点需要注意,如果创建的这个Activity的相关任务栈存在,并且在任务栈中存在这个Activity的实例的话将会把这个任务栈放到栈顶,那么在这个Activity实例之上的Activity都将执行出栈操作。

4.singleInstance:

这种模式和singleTask很像,基本上由singleTask的所有特点。但是不同的是以这种模式创建的Activity只能自己单独的处于一个任务栈中。

使用Intent的FLAG设置

1.FLAG_ACTIVITY_NEW_TASK:

和singleTask模式类似,启动的Activity都会位于自己的任务栈中。以这种模式启动Activity经常用来列出很多可以启动的选项来进行启动。

2.FLAG_ACTIVITY_SINGLE_TOP:

和singleInstance模式基本相同。

3.FLAG_ACTIVITY_CLEAR_TOP:

设置了这个FLAG的Activity在启动的时候如果在当前任务栈中已经存在实例,会将存在的实例之上的所有Activity全部出栈。


以上是关于Activity启动模式的主要内容,如果未能解决你的问题,请参考以下文章

Activity启动模式

Activity的启动模式

activity的四种启动模式

Activity启动模式(launchMode)详解

Activity的四种启动模式

Activity的四种启动模式