四大启动模式深入剖析
Activity 的启动模式也是一个难点,原因是形形色色的启动模式和标志位太容易混淆,但是 Activity 作为四大组件之首,它的确非常重要,为了满足项目的需求,必须使用 Activity 的启动模式。
1. Activity 的 LaunchMode
1.1 启动模式
之所以 Activity 使用启动模式,因为 Activity 的创建是在任务栈中的,当我们启动同一个 Activity 时,系统就会创建多个 Activity 实例放入任务栈中,当我们按 back 键时,任务栈中的实例就会一一出栈。栈我想并不陌生,具有的特点:先进先出。如果我们不允许系统重复创建相同的 Activity ,我们就会用到 Activity 的启动模式进行设置。Activity 的启动模式分为四种 standard、singleTop、singleTask和 singleInstance,之前的那篇文章也有相关介绍,下面就简单提一下。
(1)standard 标准模式 :
这是系统默认的启动模式,每次启动一个 Activity 都会创建一个新的实例,不管这个实例是否存在。如果 A 启动了 B,B 的活动就会进入到 A 的任务栈中。
(2)singleTop 栈顶复用模式 :
在这种启动模式下,新的 Activity 已经位于栈顶,如果再次启动该 Activity ,此 Activity不会被重新创建。同时系统的 onNewIntent 方法被回调,通过此方法的参数我们可以取出当前的请求信息。当然 Activity 的 onCreate、onStart 和 onResume 方法不会重新被调用。如果该 Activity 没有位于栈顶,该活动就会重新被创建。
(3)singleTask 栈内复用模式 :
这是一种单例模式,在这种模式下,只要栈中存在该实例,该实例不会被重新创建。比如:我们想要创建一个实例 A,系统就会先判断任务栈中是否存在和 A 同样的实例。如果实例存在任务栈中,系统就会把 A 调用到栈顶并调用它的 onNewIntent 方法,同时 A 以上的 Activity 实例都会被移除出栈直到 A 位于栈顶位置;如果实例不存在,系统就会创新创建一个新的实例 A 并将其压入栈顶。
(3)singleInstance 单实例模式 :
我通常把这种模式的 Activity 称为 singleTask 模式的加强版,除了具有 singleTask 模式具有的特点外,以 singleInstance 启动的 Activity 实例单独存在一个任务栈中,后续的请求不会创建新的实例。
1.2 任务栈
什么是任务栈?各个 Activity 是怎么样分配到各个任务栈的?以下情况都是在 singleTask模式情况下来说的。
定义:
从一个参数说起,TaskAffinity ,翻译为任务的相关性,这个参数标识了一个 Activity 所需要得任务栈的名字,默认情况下,Activity 所需要的任务栈的名字为应用的包名。任务栈分为前台任务栈和后台任务栈,后台任务栈中的 Activity 处于暂停状态,用户可以将后台任务栈切换到前台。 ——任务栈
1.3 设置启动模式的两种方式
第一种方式 : 通过 AndroidMenifest 配置文件设置启动模式。
1<activity2 android:name=\".MonitoringActivitys.MonitorActivity\"3 android:label=\"@string/title_activity_monitor\"4 android:theme=\"@style/AppTheme.NoActionBar\"5 android:launchMode=\"singleTask\">6 <intent-filter>7 <action android:name=\"android.intent.action.MAIN\" />8 <category android:name=\"android.intent.category.LAUNCHER\" />9 </intent-filter>10 </activity>
第二种方式 : 通过 Intent 中设置标志位来设置启动模式。
1Intent intent = new Intent(FirstActivity.this, SecondActivity.class);2intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);3startActivity(intent);
区别:
① 第二种优先级要高于第一种
② 第一种无法给 Activity 设定 FLAG_ACTIVITY_CLEAR_TOP 标识,第二种无法为 Activity 指定 singleInstance 模式。