Task
Task属于操作系统,Task是activity的堆栈
在 Android 中,Task(任务) 是一个核心概念,用于管理用户交互的一系列相关组件(主要是 Activity),它本质上是一个Activity 堆栈(Stack),遵循 “后进先出(LIFO)” 原则。尽管 Task 是 Android 系统(而非底层操作系统内核)管理的组件,但它深刻影响着应用的用户体验和组件生命周期。
一、Task 的核心本质
- Activity 堆栈Task 以堆栈形式组织 Activity:
- 当用户启动一个新 Activity 时,它会被压入当前 Task 的栈顶(成为用户可见的前台 Activity)。
- 当用户按返回键时,栈顶 Activity 出栈,前一个 Activity 恢复为前台。
- 当栈中所有 Activity 出栈后,Task 为空,系统会销毁该 Task 以释放资源。
- 例:打开「微信首页」→ 进入「聊天页」→ 打开「朋友圈」,Task 堆栈为:
[微信首页, 聊天页, 朋友圈](栈顶是朋友圈)。 - 跨应用组件组合Task 可以包含不同应用的 Activity。例如:在浏览器中点击一个电话号码,系统会启动拨号应用的拨号 Activity,此时拨号 Activity 会被压入浏览器所在的 Task 堆栈(而非单独创建新 Task),返回时仍回到浏览器页面。
- 与操作系统的关系Task 是 Android 框架层(Framework)的概念,由 ActivityManagerService(AMS) 管理,而非 Linux 内核的进程 / 线程调度。但 Task 中的 Activity 运行在所属应用的进程中,一个 Task 可能对应多个进程(当包含跨应用 Activity 时)。
二、Task 的关键特性
- 任务亲和性(Task Affinity)
- 每个 Activity 都有
taskAffinity属性(默认与应用包名一致),用于指定它 “倾向” 属于哪个 Task。 - 若 Activity 的
taskAffinity与当前 Task 不同,启动时可能会被放入新 Task(需配合launchMode或Intent标志)。 - 用途:实现 “文档型应用”(如邮件客户端,每封邮件在独立 Task 中打开,可通过多任务切换快速切换邮件)。
- 每个 Activity 都有
- **启动模式(Launch Mode)**启动模式通过
AndroidManifest.xml的launchMode或Intent标志(如FLAG_ACTIVITY_NEW_TASK)控制 Activity 如何进入 Task 堆栈,核心模式包括:- standard(默认):每次启动都创建新实例,压入当前栈顶。
- singleTop:若栈顶已是该 Activity,则复用(调用
onNewIntent),否则创建新实例。 - singleTask:确保栈中只有一个实例,若已存在则将其上方的 Activity 出栈,使其成为栈顶。
- singleInstance:该 Activity 独占一个 Task,且栈中只有它自己(如系统拨号界面)。
- **任务栈管理(通过 Intent 标志)**常用标志可动态改变 Task 行为:
FLAG_ACTIVITY_NEW_TASK:启动新 Task 并将 Activity 放入其中(常用于非 Activity 上下文启动 Activity,如 Service 中)。FLAG_ACTIVITY_CLEAR_TOP:若目标 Activity 已在栈中,则销毁其上方所有 Activity,使其成为栈顶(类似singleTask)。FLAG_ACTIVITY_SINGLE_TOP:等效于singleTop启动模式。
三、Task 与 Activity 的生命周期关联
Task 堆栈的变化直接触发 Activity 的生命周期:
- 当 Activity 被压入栈顶(前台可见):经历
onCreate() → onStart() → onResume()。 - 当 Activity 被新 Activity 覆盖(仍在栈中,后台):经历
onPause() → onStop()(但未销毁)。 - 当 Activity 从栈顶出栈(用户返回或被销毁):经历
onPause() → onStop() → onDestroy()。
特殊场景:若系统内存不足,可能会销毁后台 Task 中处于 onStop() 状态的 Activity,但保留其状态(通过 onSaveInstanceState 保存);当用户再次返回该 Task 时,系统会重建 Activity 并恢复状态。
四、Task 的实际应用场景
- 多任务切换用户通过 “最近任务” 按钮切换 Task,每个 Task 对应一个 “应用快照”,切换时显示栈顶 Activity 的界面(如切换微信和浏览器)。
- 清空任务栈退出应用时,可通过
FLAG_ACTIVITY_CLEAR_TASK+FLAG_ACTIVITY_NEW_TASK清除现有 Task 并启动新的根 Activity(避免用户返回旧页面)。 - 保留任务状态系统会在应用退到后台时保留 Task 堆栈(即使进程被销毁),用户再次启动时恢复栈顶 Activity(如退出微信后,再次打开仍显示之前的聊天页)。
总结
- Task 是 Android 系统管理 Activity 的堆栈结构,遵循 LIFO 原则,包含一个或多个 Activity(可跨应用)。
- 核心作用是维护用户交互的连贯性,让用户感觉 “操作是连续的”(如返回键导航)。
- 通过
taskAffinity、启动模式和 Intent 标志,可灵活控制 Activity 在 Task 中的行为,适应不同业务场景(如单实例页面、跨应用协作)。
理解 Task 机制是掌握 Android 组件生命周期和页面导航的关键,也是面试中常考的基础知识点。