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 渲染 |