Android 中的 android:launchMode 决定了 Activity 在启动时如何在任务栏中管理它的存在方式。下面我们来结合 Task Stack 管理详细解释。
1. android:launchMode 的四种模式
1.1 standard (标准模式, 默认)
- 启动方式:每次启动都会创建一个新实例并压入栏任务堆中。
- 应用场景:适用于需要多个实例的场景,比如详情页。
- 示例配置:
<activity android:name=".StandardActivity"android:launchMode="standard"/>
1.2 singleTop (堆顶复用模式)
- 启动方式:如果标的
Activity已经在栏顶,则会复用它并调用onNewIntent();否则依然创建新实例。 - 应用场景:适用于消息推送页面、搜索页面。
- 示例配置:
<activity android:name=".SingleTopActivity"android:launchMode="singleTop"/>
1.3 singleTask (堆内复用模式)
- 启动方式:如果任务栏中已经存在该
Activity,则复用它并清除其上的Activity;否则创建新实例。 - 应用场景:适用于 App 主页面。
- 示例配置:
<activity android:name=".SingleTaskActivity"android:launchMode="singleTask"/>
1.4 singleInstance (全局单例模式)
- 启动方式:每次都在单独的任务栏中启动,全局仅一个实例。
- 应用场景:适用于蓝牙配对界面、视频播放器。
- 示例配置:
<activity android:name=".SingleInstanceActivity"android:launchMode="singleInstance"/>
2. Android 如何管理 Task Stack
在 Android 中,任务栈(Task Stack)的管理主要由 ActivityManagerService(AMS) 和 TaskSupervisor 负责,具体来说:
2.1 ActivityManagerService(AMS)
AMS是 Android 系统的 核心服务,负责管理Activity的生命周期、任务栈以及进程调度。- 当
Activity启动或销毁时,AMS会根据launchMode和IntentFlags 决定Activity是否应该创建新的实例,还是复用已有的Activity。 - 主要职责:
- 维护任务栈(
Task Stack) - 处理
Activity的启动/切换/销毁 - 进行进程管理和调度
- 维护任务栈(
2.2 TaskSupervisor
TaskSupervisor是AMS内部的一个类,专门用于管理任务栈(Task)。TaskSupervisor主要负责:- 创建/删除任务栈(
Task) - 管理任务栈的切换
- 根据
launchMode规则调整Activity的位置 - 清除特定
Activity之上的Activity(如singleTask)
- 创建/删除任务栈(
2.3 ActivityStack
ActivityStack代表一个 任务栈,它包含一组ActivityRecord(即Activity的实例信息)。AMS通过ActivityStack来管理Activity的启动、暂停、恢复等操作。
任务栈管理流程
当一个 Activity 启动时,AMS 主要执行以下操作:
-
应用请求启动
Activity:- 通过
startActivity(Intent)发送启动请求。 - 由
ActivityTaskManagerService处理该请求。
- 通过
-
判断
launchMode:- 如果是
standard,总是创建新实例。 - 如果是
singleTop,检查栈顶Activity是否是相同实例,若相同则复用。 - 如果是
singleTask,查找任务栈内是否已有实例,若有则复用并清除其上的Activity。 - 如果是
singleInstance,则启动Activity并创建独立任务栈。
- 如果是
-
通知
TaskSupervisor处理任务栈调整:- 可能涉及
ActivityStack切换、Activity回收等操作。
- 可能涉及
-
最终交给
ActivityThread处理 UI:AMS通过Binder进程间通信(IPC)通知ActivityThread在目标App进程中创建Activity实例,并回调onCreate()。
示例分析
假设你启动了 MainActivity(singleTask):
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
如果任务栈中已有 MainActivity:
AMS发现MainActivity在栈中,调用onNewIntent()并清除它上面的Activity。
如果任务栈中没有 MainActivity:
AMS创建MainActivity实例,并将其加入任务栈。
总结
| 组件 | 作用 |
|---|---|
| ActivityManagerService (AMS) | 负责管理 Activity 生命周期、进程和任务栈 |
| TaskSupervisor | 负责创建/销毁 Task,维护 Activity 之间的关系 |
| ActivityStack | 代表一个 Task,存放 ActivityRecord |
| ActivityThread | 运行在 App 进程中,负责 Activity 的创建、UI 渲染 |