Activity的LanchMode
在默认情况下,我们多次启动同一个Activity时,系统会创建多个实例并把他们放入到任务栈中,每当按back键返回,处于栈顶的Activity就会出栈,一直下去,知道栈为空。任务栈与数据结构栈模式一致,都是“后进先出”。那么,对于同一次活动,如果我们多次启动,就多次创建相同的实例,这样其实在某些情况下对资源的利用是一种浪费,因此,安卓开发中就有了四种启动模式:standard、singleTop、singleTask、singlnstance
(1)standard
系统的默认模式为标准模式,这种模式下,每一次启动activity都会重新创建一个实例,然后放入任务栈中(即使栈中已经存在了这个实例。那么这个acitivity的生命周期符合经典情况下的生命周期,如onCreate等。
- 需要注意的是,每个实例可以属于不同的栈,谁启动了Activity,Activity就会进入到对应的栈。
- 因ApplicationContext没有任务栈,所以无法采用标准模式启动Activity。但可通过为待启动的Activity指定标记位:FLAG_ACTIVITY_NEW_TASK,那么在启动时就会为其创建一个新的任务栈(这实际上是采用了singleTask启动模式)
(2)singleTop
栈顶复用模,其实很好理解,就是如果启动的Activity已经存在于当前任务栈的栈顶,那么就可以复用栈顶的这个实例,而不会重新创建一个新的实例,这样子对于资源的利用率就提高了。
需要注意的是,在这种情况下,onCreate、onStart不会被系统调用,因为这个实例并没有改变。并且,如果新启动的活动没有位于栈顶,仍然会被重新创建。
(3)singleTask
栈内复用模式。同样很好理解,只要新启动的Activity于任务栈中已经存在,那么系统不会再重新创建该实例,而是把存在的栈调到栈顶并调用onNewIntent方法。
(4)singleInstance
单实例模式。它除了具有singleTask模式的所有特性之外,还要求Activity只能位于一个单独地任务栈中。那么,由于栈内复用的特性,后续再次启动都不会创建新的实例,除非这个栈被系统回收。
启动模式的指定方法
上面简单介绍了活动的启动模式,其实并不难理解,接下来看一个启动模式如何指定。
1.通过AndroidMenifest指定
<activity
android:name="activity"
android:configChanges="screenLayout"
android:lanchMode="singleTask"
android:label="@string/app_name" />
2.通过设置Intent标志位
Intent intent=new Intent(MainActivity.this,secondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
标记位属性及其含义
FLAG_ACTIVITY_SINGLE_TOP 指定启动模式为栈顶复用模式(singleTop)
FLAG_ACTIVITY_NEW_TASK 指定启动模式为标准模式(standard)
FLAG_ACTIVITY_CLEAR_TOP 所有位于其上层的Activity都要移除,一般和singleTask启动模式一起使用
从优先级来看,第二种方式要高于第一种,如果两种方式同时存在,将会以第二种方式为准。但是,需要注意,第二中方式无法为其指定单实例模式;Manifest设置方式无法设定FLAG_ACTIVITY_CLEAR_TOP标识。
总结
本文简要介绍了Activity的几种启动模式,具体实现读者可以按照设置方法设置后,结合AS去理解。