Activity的LaunchMode
- standard:标准模式,也是系统的默认模式。每次启动一个Activity都会重新建一个新的实例,不管这个实例是否已经存在。被创建的实例具有Activity典型的生命周期,在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的任务栈中。注意不能用ApplicationContext启动standard模式Activity,因为ApplicationContext并没有任务栈。
- singleTop:栈顶复用模式。在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,而且这个Acitivity的onCreate、onStart不会被调用。如果新的Activity不是位于栈顶,那么这个Activity会被重新创建。
- singleTask:栈内复用模式。这是一种单例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建是实例,同时它的onNewIntent会被回调,而且singleTask默认具有clearTop效果,即如果一个Activity存在任务栈中并且没有位于栈顶,那么当它启动的时候会把它上面的Activity全部出栈,把它切换到栈顶并回调onNewIntent方法。
- singleInstance:单例模式。这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,它还只能单独位于一个任务栈中。
Activity的Flags
- FLAG_ACTIVITY_NEW_TASK 这个标记位的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定该启动模式相同。
- FLAG_ACTIVITY_SINGLE_TOP这个标记为的作用是为Activity指定‘singleTop’启动模式,其效果和在XML中指定该启动模式相同。
- FLAG_ACTIVITY_CLEAR_TOP具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。这个标记为一般会和singleTask启动模式一起出现,在这种情况下,被启动Activity的实例如果已经存在,那么系统就会调用他的onNewIntent.如果被启动Activity采用standard模式启动,那么它连同他之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS具有这个标记位的Activity不会出现在最近任务列表中,它等同于在XML中指定Activity的属性android:excludeFromRecents=“true”。
给Activity指定启动模式
- 通过AndroidMenifest给Activity指定启动模式
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
通过Intent中设置标志位来给Activity指定气筒模式
Intent intent = new Intent();
intent.setClass(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);两种方式都可以为Activity指定启动模式,但是二者还是有区别的。首先,优先级上,第二种方式的优先级要高于第一种,其次,两种方式在限定范围也会有所不同,比如第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式。
- 附上项目地址:https://github.com/boomshakalala/ActivityLaunchModeDemo.git