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启动模式的主要内容,如果未能解决你的问题,请参考以下文章