Activity的启动模式
Activity的LaunchMode
standard标准模式
系统的默认模式,每次启动都会重新创建一个新的实例。
standard模式的Activity默认会进入启动它的Activity所属的任务栈中,在使用ApplicationContext去启动standard模式的Activity的时候会运行时异常。解决这个问题的方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK
标记位,这样启动的时候就会为它创建一个新的任务栈,这个时候待启动Activity实际上是以singleTask模式启动的。
singleTop栈顶复用模式
如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent
方法会被回调,通过此方法的参数我们可以取出当前请求的信息。这个Activity的onCreate、onStart不会被系统调用,因为他们没有发生改变。如果新Activity的实例已经存在但是不在栈顶,那么新Activity仍然会重新创建。
singleTask栈内复用模式
只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,系统会回调onNewIntent
方法。当一个具有singleTask模式的Activity请求启动后,系统会首先寻找此Activity所需要的任务栈,如果需要的任务栈不存在,就重新创建一个任务栈,然后创建Activity的实例后把Activity放入栈中;如果存在Activity所需要的任务栈,并且Activity的实例存在,则把Activity调到栈顶并调用onNewIntent
方法,如果实例不存在,就创建Activity的实例并把Activity放入栈中。
- 例如目前任务栈S1中的情况为ADBC,这个时候Activity D以singleTask模式请求启动,所需的任务栈为S1,根据站内复用原则,D不会被重新创建,系统会把D切换到栈顶,并调用其
onNewIntent
方法,同时由于singleTask默认具有clearTop效果,会导致栈内所有在D上面的Activity全部出栈,因此,S1中的情况为AD。
singleInstance单实例模式
为加强的singleTask模式,此种模式只能单独的位于一个任务栈中
- Activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A就在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁。
给Activity指定启动模式
-
通过AndroidMenifest设置
android:launchMode="singleTask"
-
通过Intent中设置标志位
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
FLAG_ACTIVITY_NEW_TASK
为Activity指定“singleTask”启动模式 -
FLAG_ACTIVITY_SINGLE_TOP
为Activity指定“singleTop”启动模式 -
FLAG_ACTIVITY_CLEAR_TOP
使用此标记的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。此模式一般和FLAG_ACTIVITY_NEW_TASK 配合使用。 -
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
使用此标记的Activity不会出现在历史Activity的列表里,相当于
android:excludeFromRecents="true"
-
FLAG_ACTIVITY_NEW_TASK