四大启动模式深刻剖析android
Activity 的启动模式也是一个难点,缘由是形形色色的启动模式和标志位太容易混淆,可是 Activity 做为四大组件之首,它的确很是重要,为了知足项目的需求,必须使用 Activity 的启动模式。ide
1. Activity 的 LaunchModethis
1.1 启动模式翻译
之因此 Activity 使用启动模式,由于 Activity 的建立是在任务栈中的,当咱们启动同一个 Activity 时,系统就会建立多个 Activity 实例放入任务栈中,当咱们按 back 键时,任务栈中的实例就会一一出栈。栈我想并不陌生,具备的特色:先进先出。若是咱们不容许系统重复建立相同的 Activity ,咱们就会用到 Activity 的启动模式进行设置。Activity 的启动模式分为四种 standard、singleTop、singleTask和 singleInstance,以前的那篇文章也有相关介绍,下面就简单提一下。code
(1)standard 标准模式 :blog
这是系统默认的启动模式,每次启动一个 Activity 都会建立一个新的实例,无论这个实例是否存在。若是 A 启动了 B,B 的活动就会进入到 A 的任务栈中。string
(2)singleTop 栈顶复用模式 :it
在这种启动模式下,新的 Activity 已经位于栈顶,若是再次启动该 Activity ,此 Activity不会被从新建立。同时系统的 onNewIntent 方法被回调,经过此方法的参数咱们能够取出当前的请求信息。固然 Activity 的 onCreate、onStart 和 onResume 方法不会从新被调用。若是该 Activity 没有位于栈顶,该活动就会从新被建立。io
(3)singleTask 栈内复用模式 :class
这是一种单例模式,在这种模式下,只要栈中存在该实例,该实例不会被从新建立。好比:咱们想要建立一个实例 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 配置文件设置启动模式。
2 android:name=".MonitoringActivitys.MonitorActivity"
3 android:label="@string/title_activity_monitor"
4 android:theme="@style/AppTheme.NoActionBar"
5 android:launchMode="singleTask">
第二种方式 : 经过 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 模式。