您的位置:首页 > 移动开发 > Android开发

Android 高级进阶之深入剖析四大启动模式

2021-01-22 23:47 1396 查看

四大启动模式深入剖析

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<activity
2      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 模式。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: