一.Android为什么需要启动模式
在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们放入任务栈中,当我们单击back键时,这些Activity会一一回退。任务栈是一种"后进先出"的栈结构,每一次back就会有一个Activity出栈,直到栈空为止,当栈中无任何Activity的时候,系统就会回收这个任务栈。
二.四种启动模式
1.standard:标准模式(系统默认模式),每次启动一个Activity都会重新创建一个实例,不管这个实例是否已经存在。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。当我们用ApplicationContext启动一个standard模式的Activity,会报AndroidRuntimeException错误,因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但由于非Activity的Context并没有所谓的任务栈,所以报错。解决方案添加FLAG_ACTIVITY_NEW_TASK标记位,为它创建一个新的任务栈,实际上是以singleTask模式启动的。
2.singleTop:栈顶复用模式,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建。它的onNewIntent方法会被回调,但不会调用onCreate,onStart。如果新的Activity的实例已经存在但不是位于栈顶,那么新的Activity仍然会被创建。
3.singleTask:栈内复用模式,这是一种单实例模式,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,它的onNewIntent方法会被回调。singleTask默认具有clearTop的效果,会导致栈内所有在此实例之上的Activity全部出栈。
4.singleInstance:单实例模式,这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,就是具有此种模式的Activity,系统会为它创建一个新的任务栈,然后独自在这个任务栈中。
三.Activity的标记位Flags
常用标记位
(1). Intent.FLAG_ACTIVITY_NEW_TASK,是为Activity指定“singleTask”启动模式
(2). Intent.FLAG_ACTIVITY_SINGLE_TOP,是为Activity指定“singleTop”启动模式
(3). FLAG_ACTIVITY_CLEAR_TOP,如果跟singleTask启动模式一起出现,如果被启动的Activity已经存在实例,则onNewIntent方法会被回调,如果被启动的Activity采用standard模式启动,那么连同它跟它之上的Activity都要出栈,并且创建新的实例放入栈顶。
(4). FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,新的Activity不会在最近启动的Activity的列表中保存。等同于指定属性android:excludeFromRecents="true"
四.如何给Activity指定启动模式
1.AndroidManifest中为Activity指定启动模式
android:launchMode="singleTask"
2.通过在Intent中设置标记位来指定Activity的启动模式
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3.两种方式的区别
优先级上第二种的优先级要高于第一种,第一种方式无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,第二种方式无法为Activity指定singleInstance模式。