第二板块:Android 四大组件标准化学理 | 第七篇:Activity 页面载体与任务栈算法

第二板块:Android 四大组件标准化学理 | 第七篇:Activity 页面载体与任务栈算法(超深度版)

所属板块:第二板块 --- Android 四大组件标准化学理

前置知识:第六篇中的 Manifest 规范、Intent 机制、AMS 调度原理、Zygote 进程孵化、Binder IPC 机制

本篇定位 :这是 Android 系统中交互最复杂、状态最易变、调度最频繁的核心组件。本篇将以 "显微镜" 的视角,对 Activity 进行外科手术式的解剖。我们将不再满足于"是什么",而是深入探究 "为什么是这样" 以及 "底层源码如何实现" 。内容涵盖 ActivityThread 与 AMS 的双进程博弈Token 的身份证机制Window 的创建与 Surface 的诞生Choreographer 的 VSYNC 信号与渲染流水线TaskRecord 与 ActivityRecord 的源码级数据结构启动模式的 27 种边界场景算法配置变更的销毁重建与状态恢复机制。全程无业务代码、无 UI 编写技巧、无性能优化建议,仅保留 Android Framework 的底层定义与系统级调度规范。


1. 核心结论先行(Thesis Statement)

Activity 是 Android 操作系统中唯一具有可视化界面的组件 ,但它不是一个普通的 Java 对象 ,而是一个由系统服务(AMS)管理的、具有复杂状态机的、运行在特定进程中的、拥有独立窗口的实体

  • Activity 的本质 :一个页面载体(Page Container) 。它持有 Window 对象,负责承载 UI 视图(View Tree),并通过 WindowManager 与系统窗口服务交互。
  • Token 的本质 :一个 Binder 代理对象(IBinder) 。它是 Activity 在系统服务(AMS/WMS)中的唯一身份证。没有 Token,Activity 无法与系统对话,也无法弹出 Dialog。
  • 任务栈的本质 :一个后进先出(LIFO)的栈结构。用于管理 Activity 的导航历史,确保用户可以通过 Back 键按预期返回。
  • 启动模式的本质 :系统对 Activity 实例化行为的约束规则。用于控制是否创建新实例、是否复用现有实例、以及实例在任务栈中的位置。
  • 调度中心ActivityManagerService (AMS) 维护着所有 Activity 的状态机,通过 Binder 与应用的 ApplicationThread 通信,指挥 Activity 的创建、暂停、恢复和销毁。

2. Activity 生命周期拓扑学(Lifecycle Topology)

2.1 生命周期状态机(State Machine)

Activity 的生命周期是一个确定的有限状态机(Deterministic Finite Automaton, DFA)。理解它,首先要理解**"系统为什么要在此时调用这个方法"**。
#mermaid-svg-DLkh5AM0wOerYT9O{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DLkh5AM0wOerYT9O .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DLkh5AM0wOerYT9O .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DLkh5AM0wOerYT9O .error-icon{fill:#552222;}#mermaid-svg-DLkh5AM0wOerYT9O .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DLkh5AM0wOerYT9O .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DLkh5AM0wOerYT9O .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DLkh5AM0wOerYT9O .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DLkh5AM0wOerYT9O .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DLkh5AM0wOerYT9O .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DLkh5AM0wOerYT9O .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DLkh5AM0wOerYT9O .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DLkh5AM0wOerYT9O .marker.cross{stroke:#333333;}#mermaid-svg-DLkh5AM0wOerYT9O svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DLkh5AM0wOerYT9O p{margin:0;}#mermaid-svg-DLkh5AM0wOerYT9O defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-DLkh5AM0wOerYT9O g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-DLkh5AM0wOerYT9O g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-DLkh5AM0wOerYT9O g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-DLkh5AM0wOerYT9O g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-DLkh5AM0wOerYT9O g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-DLkh5AM0wOerYT9O .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-DLkh5AM0wOerYT9O .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-DLkh5AM0wOerYT9O .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-DLkh5AM0wOerYT9O .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-DLkh5AM0wOerYT9O .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-DLkh5AM0wOerYT9O .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-DLkh5AM0wOerYT9O .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-DLkh5AM0wOerYT9O .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DLkh5AM0wOerYT9O .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DLkh5AM0wOerYT9O .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DLkh5AM0wOerYT9O .edgeLabel .label text{fill:#333;}#mermaid-svg-DLkh5AM0wOerYT9O .label div .edgeLabel{color:#333;}#mermaid-svg-DLkh5AM0wOerYT9O .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-DLkh5AM0wOerYT9O .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-DLkh5AM0wOerYT9O .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-DLkh5AM0wOerYT9O .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-DLkh5AM0wOerYT9O .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-DLkh5AM0wOerYT9O .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DLkh5AM0wOerYT9O .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DLkh5AM0wOerYT9O #statediagram-barbEnd{fill:#333333;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DLkh5AM0wOerYT9O .cluster-label,#mermaid-svg-DLkh5AM0wOerYT9O .nodeLabel{color:#131300;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-DLkh5AM0wOerYT9O .note-edge{stroke-dasharray:5;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-note text{fill:black;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram-note .nodeLabel{color:black;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagram .edgeLabel{color:red;}#mermaid-svg-DLkh5AM0wOerYT9O #dependencyStart,#mermaid-svg-DLkh5AM0wOerYT9O #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-DLkh5AM0wOerYT9O .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DLkh5AM0wOerYT9O :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} onCreate()
onStart()
onResume()
onPause()
onResume()
onStop()
onStart()
onDestroy()
onStop()
onDestroy()
onDestroy()
Created
Started
Resumed
Paused
Stopped
Destroyed
用户可交互状态

Activity 位于前台
部分可见状态

(如对话框遮挡)
完全不可见

可能被系统回收

2.2 生命周期回调的系统级含义

回调方法 系统触发时机 学术定义 是否可回收
onCreate Activity 首次创建 初始化基础状态、加载布局、绑定数据
onStart Activity 变为可见 注册广播、开始动画、初始化可见资源
onResume Activity 进入前台 获取焦点、开始活跃交互、启动传感器
onPause Activity 失去焦点 停止动画、提交未保存数据、释放独占资源 (极端情况下)
onStop Activity 完全不可见 停止所有活动、释放非必要资源
onDestroy Activity 被销毁 清理所有资源、关闭线程、注销监听器
onRestart Activity 从 Stopped 恢复 重新初始化在 onStop 中释放的资源

学术定义

  • 可回收点onPause()onStop() 是系统回收 Activity 的潜在时机。系统可能在这两个回调之后,因内存压力直接杀死进程,而不调用 onDestroy()。因此,持久化数据必须在 onPause() 中完成。

3. 任务栈(Task)与回退栈(Back Stack)算法

3.1 任务栈的数据结构

任务栈(Task)是一个虚拟的容器 ,用于组织一组相关的 Activity。回退栈(Back Stack)是任务栈的具体实现,遵循 LIFO(后进先出) 原则。
#mermaid-svg-INap9JFj0xCcSSvK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-INap9JFj0xCcSSvK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-INap9JFj0xCcSSvK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-INap9JFj0xCcSSvK .error-icon{fill:#552222;}#mermaid-svg-INap9JFj0xCcSSvK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-INap9JFj0xCcSSvK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-INap9JFj0xCcSSvK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-INap9JFj0xCcSSvK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-INap9JFj0xCcSSvK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-INap9JFj0xCcSSvK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-INap9JFj0xCcSSvK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-INap9JFj0xCcSSvK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-INap9JFj0xCcSSvK .marker.cross{stroke:#333333;}#mermaid-svg-INap9JFj0xCcSSvK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-INap9JFj0xCcSSvK p{margin:0;}#mermaid-svg-INap9JFj0xCcSSvK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-INap9JFj0xCcSSvK .cluster-label text{fill:#333;}#mermaid-svg-INap9JFj0xCcSSvK .cluster-label span{color:#333;}#mermaid-svg-INap9JFj0xCcSSvK .cluster-label span p{background-color:transparent;}#mermaid-svg-INap9JFj0xCcSSvK .label text,#mermaid-svg-INap9JFj0xCcSSvK span{fill:#333;color:#333;}#mermaid-svg-INap9JFj0xCcSSvK .node rect,#mermaid-svg-INap9JFj0xCcSSvK .node circle,#mermaid-svg-INap9JFj0xCcSSvK .node ellipse,#mermaid-svg-INap9JFj0xCcSSvK .node polygon,#mermaid-svg-INap9JFj0xCcSSvK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-INap9JFj0xCcSSvK .rough-node .label text,#mermaid-svg-INap9JFj0xCcSSvK .node .label text,#mermaid-svg-INap9JFj0xCcSSvK .image-shape .label,#mermaid-svg-INap9JFj0xCcSSvK .icon-shape .label{text-anchor:middle;}#mermaid-svg-INap9JFj0xCcSSvK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-INap9JFj0xCcSSvK .rough-node .label,#mermaid-svg-INap9JFj0xCcSSvK .node .label,#mermaid-svg-INap9JFj0xCcSSvK .image-shape .label,#mermaid-svg-INap9JFj0xCcSSvK .icon-shape .label{text-align:center;}#mermaid-svg-INap9JFj0xCcSSvK .node.clickable{cursor:pointer;}#mermaid-svg-INap9JFj0xCcSSvK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-INap9JFj0xCcSSvK .arrowheadPath{fill:#333333;}#mermaid-svg-INap9JFj0xCcSSvK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-INap9JFj0xCcSSvK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-INap9JFj0xCcSSvK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-INap9JFj0xCcSSvK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-INap9JFj0xCcSSvK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-INap9JFj0xCcSSvK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-INap9JFj0xCcSSvK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-INap9JFj0xCcSSvK .cluster text{fill:#333;}#mermaid-svg-INap9JFj0xCcSSvK .cluster span{color:#333;}#mermaid-svg-INap9JFj0xCcSSvK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-INap9JFj0xCcSSvK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-INap9JFj0xCcSSvK rect.text{fill:none;stroke-width:0;}#mermaid-svg-INap9JFj0xCcSSvK .icon-shape,#mermaid-svg-INap9JFj0xCcSSvK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-INap9JFj0xCcSSvK .icon-shape p,#mermaid-svg-INap9JFj0xCcSSvK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-INap9JFj0xCcSSvK .icon-shape .label rect,#mermaid-svg-INap9JFj0xCcSSvK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-INap9JFj0xCcSSvK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-INap9JFj0xCcSSvK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-INap9JFj0xCcSSvK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务栈 (Task ID: 1001)
点击 Back 键
弹出栈顶
弹出栈顶
退出任务
任务栈 (Task ID: 1002)
Activity X (Root)
Activity Y (Top)
Activity A (Root)
Activity B
Activity C (Top)
用户
桌面

3.2 ActivityRecord 与 TaskRecord(内核数据结构)

AMS 在内存中维护着 Activity 的精确映射。

java 复制代码
// com.android.server.am.TaskRecord
class TaskRecord {
    final int taskId;                     // 任务栈 ID
    final ArrayList<ActivityRecord> mActivities; // 栈内的 Activity 列表
    String affinity;                     // 任务栈亲和力
    int numActivities;                   // Activity 数量
}

// com.android.server.am.ActivityRecord
class ActivityRecord {
    final ActivityInfo info;              // Manifest 信息
    final String packageName;
    final String processName;            // 运行进程
    TaskRecord task;                     // 所属任务栈
    ActivityState state;                 // 当前状态
    int launchMode;                      // 启动模式
    boolean frontOfTask;                 // 是否为栈底 Activity
}

3.3 启动模式(Launch Mode)算法

启动模式决定了 Activity 在任务栈中的实例化行为。

启动模式 行为算法 栈内实例数 典型场景
standard 每次启动都创建新实例,压入当前栈顶 多个 普通页面
singleTop 若栈顶已是该实例,则复用(调用 onNewIntent);否则新建 1 或多个 通知点击页
singleTask 在任务栈中查找是否存在该实例。若存在,将其之上的 Activity 出栈,使其位于栈顶;若不存在,新建并压入栈顶 1 个 应用主界面
singleInstance 创建一个新的任务栈,且该栈中只有一个 Activity 实例 1 个 系统闹钟、来电界面

算法详解(singleTask)

  1. 查找是否存在 affinity 匹配的任务栈。
  2. 若存在,查找栈中是否存在该 Activity 实例。
  3. 若存在实例,清空该实例之上的所有 Activity,使其位于栈顶。
  4. 若不存在实例,创建新实例并压入栈顶。

4. Activity 窗口体系(Window Architecture)

4.1 Window 与 ViewRootImpl

Activity 本身不绘制 UI,它委托给 Window 对象。
#mermaid-svg-NGN9ZbOYuFwl8VPN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NGN9ZbOYuFwl8VPN .error-icon{fill:#552222;}#mermaid-svg-NGN9ZbOYuFwl8VPN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NGN9ZbOYuFwl8VPN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .marker.cross{stroke:#333333;}#mermaid-svg-NGN9ZbOYuFwl8VPN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NGN9ZbOYuFwl8VPN p{margin:0;}#mermaid-svg-NGN9ZbOYuFwl8VPN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .cluster-label text{fill:#333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .cluster-label span{color:#333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .cluster-label span p{background-color:transparent;}#mermaid-svg-NGN9ZbOYuFwl8VPN .label text,#mermaid-svg-NGN9ZbOYuFwl8VPN span{fill:#333;color:#333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .node rect,#mermaid-svg-NGN9ZbOYuFwl8VPN .node circle,#mermaid-svg-NGN9ZbOYuFwl8VPN .node ellipse,#mermaid-svg-NGN9ZbOYuFwl8VPN .node polygon,#mermaid-svg-NGN9ZbOYuFwl8VPN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NGN9ZbOYuFwl8VPN .rough-node .label text,#mermaid-svg-NGN9ZbOYuFwl8VPN .node .label text,#mermaid-svg-NGN9ZbOYuFwl8VPN .image-shape .label,#mermaid-svg-NGN9ZbOYuFwl8VPN .icon-shape .label{text-anchor:middle;}#mermaid-svg-NGN9ZbOYuFwl8VPN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NGN9ZbOYuFwl8VPN .rough-node .label,#mermaid-svg-NGN9ZbOYuFwl8VPN .node .label,#mermaid-svg-NGN9ZbOYuFwl8VPN .image-shape .label,#mermaid-svg-NGN9ZbOYuFwl8VPN .icon-shape .label{text-align:center;}#mermaid-svg-NGN9ZbOYuFwl8VPN .node.clickable{cursor:pointer;}#mermaid-svg-NGN9ZbOYuFwl8VPN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .arrowheadPath{fill:#333333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NGN9ZbOYuFwl8VPN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NGN9ZbOYuFwl8VPN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NGN9ZbOYuFwl8VPN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NGN9ZbOYuFwl8VPN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NGN9ZbOYuFwl8VPN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NGN9ZbOYuFwl8VPN .cluster text{fill:#333;}#mermaid-svg-NGN9ZbOYuFwl8VPN .cluster span{color:#333;}#mermaid-svg-NGN9ZbOYuFwl8VPN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NGN9ZbOYuFwl8VPN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NGN9ZbOYuFwl8VPN rect.text{fill:none;stroke-width:0;}#mermaid-svg-NGN9ZbOYuFwl8VPN .icon-shape,#mermaid-svg-NGN9ZbOYuFwl8VPN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NGN9ZbOYuFwl8VPN .icon-shape p,#mermaid-svg-NGN9ZbOYuFwl8VPN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NGN9ZbOYuFwl8VPN .icon-shape .label rect,#mermaid-svg-NGN9ZbOYuFwl8VPN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NGN9ZbOYuFwl8VPN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NGN9ZbOYuFwl8VPN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NGN9ZbOYuFwl8VPN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SystemServer 进程
Activity 进程
setContentView
创建
包含
加载
关联
Binder IPC (IWindowSession)
Activity
PhoneWindow
DecorView (根视图)
ContentParent (R.id.content)
ViewTree (用户布局)
ViewRootImpl
WindowManagerService (WMS)

学术定义

  • PhoneWindowWindow 的唯一实现类,负责窗口的样式、背景、标题栏。
  • DecorView:窗口的根视图,包含状态栏、导航栏、标题栏和内容区域。
  • ViewRootImpl :视图渲染的根控制器。它负责与 WMS 通信、管理视图树的测量(Measure)、布局(Layout)、绘制(Draw)、以及分发输入事件(Touch Event)。

4.2 WindowManagerService 的交互

Activity 的窗口显示需要与系统窗口服务交互。
IWindowSession WindowManagerService Activity IWindowSession WindowManagerService Activity #mermaid-svg-mXqPPvbOk1P4qFFO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mXqPPvbOk1P4qFFO .error-icon{fill:#552222;}#mermaid-svg-mXqPPvbOk1P4qFFO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mXqPPvbOk1P4qFFO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mXqPPvbOk1P4qFFO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mXqPPvbOk1P4qFFO .marker.cross{stroke:#333333;}#mermaid-svg-mXqPPvbOk1P4qFFO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mXqPPvbOk1P4qFFO p{margin:0;}#mermaid-svg-mXqPPvbOk1P4qFFO .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mXqPPvbOk1P4qFFO text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-mXqPPvbOk1P4qFFO .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-mXqPPvbOk1P4qFFO .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-mXqPPvbOk1P4qFFO .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-mXqPPvbOk1P4qFFO .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-mXqPPvbOk1P4qFFO #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-mXqPPvbOk1P4qFFO .sequenceNumber{fill:white;}#mermaid-svg-mXqPPvbOk1P4qFFO #sequencenumber{fill:#333;}#mermaid-svg-mXqPPvbOk1P4qFFO #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-mXqPPvbOk1P4qFFO .messageText{fill:#333;stroke:none;}#mermaid-svg-mXqPPvbOk1P4qFFO .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mXqPPvbOk1P4qFFO .labelText,#mermaid-svg-mXqPPvbOk1P4qFFO .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-mXqPPvbOk1P4qFFO .loopText,#mermaid-svg-mXqPPvbOk1P4qFFO .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-mXqPPvbOk1P4qFFO .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-mXqPPvbOk1P4qFFO .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-mXqPPvbOk1P4qFFO .noteText,#mermaid-svg-mXqPPvbOk1P4qFFO .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-mXqPPvbOk1P4qFFO .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mXqPPvbOk1P4qFFO .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mXqPPvbOk1P4qFFO .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mXqPPvbOk1P4qFFO .actorPopupMenu{position:absolute;}#mermaid-svg-mXqPPvbOk1P4qFFO .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-mXqPPvbOk1P4qFFO .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mXqPPvbOk1P4qFFO .actor-man circle,#mermaid-svg-mXqPPvbOk1P4qFFO line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-mXqPPvbOk1P4qFFO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} addWindow(token, attrs)检查权限、创建 WindowState返回 SurfacerelayoutWindow()请求重新布局计算窗口大小、位置返回新的 Surface绘制 ViewTree 到 Surface


5. Activity 启动全流程(37 Steps Deep Dive)

这是本篇最核心的部分。我们将详细拆解从 startActivity()onResume() 的每一步系统调用。

5.1 启动流程概览

WMS Zygote 进程 PackageManagerService ActivityManagerService ActivityThread 应用进程 (Client) WMS Zygote 进程 PackageManagerService ActivityManagerService ActivityThread 应用进程 (Client) #mermaid-svg-DqfewLh2MxCTGC2G{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DqfewLh2MxCTGC2G .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DqfewLh2MxCTGC2G .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DqfewLh2MxCTGC2G .error-icon{fill:#552222;}#mermaid-svg-DqfewLh2MxCTGC2G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DqfewLh2MxCTGC2G .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DqfewLh2MxCTGC2G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DqfewLh2MxCTGC2G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DqfewLh2MxCTGC2G .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DqfewLh2MxCTGC2G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DqfewLh2MxCTGC2G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DqfewLh2MxCTGC2G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DqfewLh2MxCTGC2G .marker.cross{stroke:#333333;}#mermaid-svg-DqfewLh2MxCTGC2G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DqfewLh2MxCTGC2G p{margin:0;}#mermaid-svg-DqfewLh2MxCTGC2G .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DqfewLh2MxCTGC2G text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-DqfewLh2MxCTGC2G .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-DqfewLh2MxCTGC2G .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-DqfewLh2MxCTGC2G .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-DqfewLh2MxCTGC2G .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-DqfewLh2MxCTGC2G #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-DqfewLh2MxCTGC2G .sequenceNumber{fill:white;}#mermaid-svg-DqfewLh2MxCTGC2G #sequencenumber{fill:#333;}#mermaid-svg-DqfewLh2MxCTGC2G #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-DqfewLh2MxCTGC2G .messageText{fill:#333;stroke:none;}#mermaid-svg-DqfewLh2MxCTGC2G .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DqfewLh2MxCTGC2G .labelText,#mermaid-svg-DqfewLh2MxCTGC2G .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-DqfewLh2MxCTGC2G .loopText,#mermaid-svg-DqfewLh2MxCTGC2G .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-DqfewLh2MxCTGC2G .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-DqfewLh2MxCTGC2G .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-DqfewLh2MxCTGC2G .noteText,#mermaid-svg-DqfewLh2MxCTGC2G .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-DqfewLh2MxCTGC2G .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DqfewLh2MxCTGC2G .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DqfewLh2MxCTGC2G .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DqfewLh2MxCTGC2G .actorPopupMenu{position:absolute;}#mermaid-svg-DqfewLh2MxCTGC2G .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-DqfewLh2MxCTGC2G .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DqfewLh2MxCTGC2G .actor-man circle,#mermaid-svg-DqfewLh2MxCTGC2G line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-DqfewLh2MxCTGC2G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} altActivity 实例不存在 1. startActivity(intent)2. resolveIntent() 解析 Intent3. 返回 ResolveInfo (ActivityInfo)4. 检查权限 (checkPermission)5. 计算 Launch Flags6. 查找或创建 TaskRecord7. 根据 Launch Mode 处理 ActivityRecord8. 创建新的 ActivityRecord9. startProcessLocked() 启动进程10. 返回新进程 PID11. bindApplication() 绑定应用12. 创建 Application13. attachApplication() 汇报就绪14. scheduleLaunchActivity() (Binder IPC)15. handleLaunchActivity()16. performLaunchActivity()17. 创建 Activity 实例 (newInstance)18. 创建 PhoneWindow19. 调用 Activity.attach()20. 调用 onCreate()21. setContentView() 加载布局22. 初始化 ViewRootImpl23. addWindow() 添加窗口24. 返回 Window 状态25. 调用 onStart()26. 调用 onResume()27. makeVisible() 显示窗口28. 窗口可见29. activityResumed() 汇报状态

5.2 关键步骤源码解析

步骤 7:Launch Mode 处理(AMS 端)

java 复制代码
// ActivityStackSupervisor.java
void startActivityLocked(...) {
    // 检查是否允许启动 Activity
    // 根据 Launch Mode 决定是否复用
    if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
        // 查找是否存在该 Activity 的记录
        ActivityRecord taskTop = r.task.topRunningActivityLocked();
        if (taskTop != null && taskTop.realActivity.equals(r.realActivity)) {
            // 复用,调用 onNewIntent
            deliverNewIntent(taskTop);
        } else {
            // 新建
            addActivityToTop(r);
        }
    }
}

步骤 20-21:onCreate 与 setContentView(App 端)

java 复制代码
// Activity.java
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); // 关键
}

public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID); // 交给 PhoneWindow
}

// PhoneWindow.java
public void setContentView(int layoutResID) {
    if (mContentParent == null) {
        installDecor(); // 创建 DecorView 和 ContentParent
    }
    mLayoutInflater.inflate(layoutResID, mContentParent); // 加载布局
}

6. Configuration 变化与销毁重建

6.1 配置变化的处理机制

当系统配置(如屏幕旋转、语言切换)发生变化时,Activity 默认会被销毁并重建。
#mermaid-svg-8Av5KzBMIG7lsVWj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8Av5KzBMIG7lsVWj .error-icon{fill:#552222;}#mermaid-svg-8Av5KzBMIG7lsVWj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8Av5KzBMIG7lsVWj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8Av5KzBMIG7lsVWj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8Av5KzBMIG7lsVWj .marker.cross{stroke:#333333;}#mermaid-svg-8Av5KzBMIG7lsVWj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8Av5KzBMIG7lsVWj p{margin:0;}#mermaid-svg-8Av5KzBMIG7lsVWj defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-8Av5KzBMIG7lsVWj g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-8Av5KzBMIG7lsVWj g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-8Av5KzBMIG7lsVWj g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-8Av5KzBMIG7lsVWj g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-8Av5KzBMIG7lsVWj g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-8Av5KzBMIG7lsVWj .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-8Av5KzBMIG7lsVWj .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-8Av5KzBMIG7lsVWj .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-8Av5KzBMIG7lsVWj .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-8Av5KzBMIG7lsVWj .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-8Av5KzBMIG7lsVWj .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-8Av5KzBMIG7lsVWj .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-8Av5KzBMIG7lsVWj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8Av5KzBMIG7lsVWj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8Av5KzBMIG7lsVWj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8Av5KzBMIG7lsVWj .edgeLabel .label text{fill:#333;}#mermaid-svg-8Av5KzBMIG7lsVWj .label div .edgeLabel{color:#333;}#mermaid-svg-8Av5KzBMIG7lsVWj .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-8Av5KzBMIG7lsVWj .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-8Av5KzBMIG7lsVWj .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-8Av5KzBMIG7lsVWj .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-8Av5KzBMIG7lsVWj .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-8Av5KzBMIG7lsVWj .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8Av5KzBMIG7lsVWj .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8Av5KzBMIG7lsVWj #statediagram-barbEnd{fill:#333333;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8Av5KzBMIG7lsVWj .cluster-label,#mermaid-svg-8Av5KzBMIG7lsVWj .nodeLabel{color:#131300;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-8Av5KzBMIG7lsVWj .note-edge{stroke-dasharray:5;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-note text{fill:black;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram-note .nodeLabel{color:black;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagram .edgeLabel{color:red;}#mermaid-svg-8Av5KzBMIG7lsVWj #dependencyStart,#mermaid-svg-8Av5KzBMIG7lsVWj #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-8Av5KzBMIG7lsVWj .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8Av5KzBMIG7lsVWj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} onSaveInstanceState()
onDestroy()
onCreate()
onRestoreInstanceState()
Running
SavingState
Destroying
Creating
RestoringState

学术定义

  • 非配置更改 :系统内存不足导致的销毁,不会调用 onSaveInstanceState() 保存临时状态。
  • 配置更改 :系统会调用 onSaveInstanceState(),将 Activity 的状态(视图状态、成员变量)保存到 Bundle 中,并在重建后恢复。

6.2 阻止重建的机制

在 Manifest 中声明 android:configChanges="orientation|screenSize" 可以阻止重建。

xml 复制代码
<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|keyboardHidden" />

系统级后果 :Activity 不会重建,但会回调 onConfigurationChanged()。此时,View 的尺寸不会自动更新,需要开发者手动处理布局适配。


7. Activity 的 Finish 与回收算法

7.1 finish() 的流程

ActivityThread ActivityManagerService Activity ActivityThread ActivityManagerService Activity #mermaid-svg-kcdTIH19qbOkEaDY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kcdTIH19qbOkEaDY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kcdTIH19qbOkEaDY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kcdTIH19qbOkEaDY .error-icon{fill:#552222;}#mermaid-svg-kcdTIH19qbOkEaDY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kcdTIH19qbOkEaDY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kcdTIH19qbOkEaDY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kcdTIH19qbOkEaDY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kcdTIH19qbOkEaDY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kcdTIH19qbOkEaDY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kcdTIH19qbOkEaDY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kcdTIH19qbOkEaDY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kcdTIH19qbOkEaDY .marker.cross{stroke:#333333;}#mermaid-svg-kcdTIH19qbOkEaDY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kcdTIH19qbOkEaDY p{margin:0;}#mermaid-svg-kcdTIH19qbOkEaDY .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kcdTIH19qbOkEaDY text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-kcdTIH19qbOkEaDY .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kcdTIH19qbOkEaDY .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-kcdTIH19qbOkEaDY .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-kcdTIH19qbOkEaDY .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-kcdTIH19qbOkEaDY #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-kcdTIH19qbOkEaDY .sequenceNumber{fill:white;}#mermaid-svg-kcdTIH19qbOkEaDY #sequencenumber{fill:#333;}#mermaid-svg-kcdTIH19qbOkEaDY #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-kcdTIH19qbOkEaDY .messageText{fill:#333;stroke:none;}#mermaid-svg-kcdTIH19qbOkEaDY .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kcdTIH19qbOkEaDY .labelText,#mermaid-svg-kcdTIH19qbOkEaDY .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-kcdTIH19qbOkEaDY .loopText,#mermaid-svg-kcdTIH19qbOkEaDY .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-kcdTIH19qbOkEaDY .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kcdTIH19qbOkEaDY .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-kcdTIH19qbOkEaDY .noteText,#mermaid-svg-kcdTIH19qbOkEaDY .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-kcdTIH19qbOkEaDY .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kcdTIH19qbOkEaDY .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kcdTIH19qbOkEaDY .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kcdTIH19qbOkEaDY .actorPopupMenu{position:absolute;}#mermaid-svg-kcdTIH19qbOkEaDY .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-kcdTIH19qbOkEaDY .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kcdTIH19qbOkEaDY .actor-man circle,#mermaid-svg-kcdTIH19qbOkEaDY line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-kcdTIH19qbOkEaDY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} finishActivity(token)标记 Activity 为 finishingscheduleDestroyActivity(token)onPause()onStop()onDestroy()activityDestroyed(token)移除 ActivityRecord调整任务栈

7.2 进程回收算法(Low Memory Killer)

当系统内存不足时,LMK 会根据 Activity 的状态决定回收顺序。

进程优先级 Activity 状态 回收概率
Foreground Resumed 极低
Visible Paused
Service Stopped
Cached Destroyed
Empty 无 Activity 极高

8. Activity 的 IPC 与 Binder 交互

Activity 频繁使用 Binder 与其他组件和系统服务通信。

8.1 Activity 与 Service 的交互

Service ActivityManagerService Activity Service ActivityManagerService Activity #mermaid-svg-7tS4HR9bnMbuA6LE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7tS4HR9bnMbuA6LE .error-icon{fill:#552222;}#mermaid-svg-7tS4HR9bnMbuA6LE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7tS4HR9bnMbuA6LE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7tS4HR9bnMbuA6LE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7tS4HR9bnMbuA6LE .marker.cross{stroke:#333333;}#mermaid-svg-7tS4HR9bnMbuA6LE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7tS4HR9bnMbuA6LE p{margin:0;}#mermaid-svg-7tS4HR9bnMbuA6LE .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7tS4HR9bnMbuA6LE text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-7tS4HR9bnMbuA6LE .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-7tS4HR9bnMbuA6LE .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-7tS4HR9bnMbuA6LE .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-7tS4HR9bnMbuA6LE .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-7tS4HR9bnMbuA6LE #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-7tS4HR9bnMbuA6LE .sequenceNumber{fill:white;}#mermaid-svg-7tS4HR9bnMbuA6LE #sequencenumber{fill:#333;}#mermaid-svg-7tS4HR9bnMbuA6LE #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-7tS4HR9bnMbuA6LE .messageText{fill:#333;stroke:none;}#mermaid-svg-7tS4HR9bnMbuA6LE .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7tS4HR9bnMbuA6LE .labelText,#mermaid-svg-7tS4HR9bnMbuA6LE .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-7tS4HR9bnMbuA6LE .loopText,#mermaid-svg-7tS4HR9bnMbuA6LE .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-7tS4HR9bnMbuA6LE .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-7tS4HR9bnMbuA6LE .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-7tS4HR9bnMbuA6LE .noteText,#mermaid-svg-7tS4HR9bnMbuA6LE .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-7tS4HR9bnMbuA6LE .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7tS4HR9bnMbuA6LE .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7tS4HR9bnMbuA6LE .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7tS4HR9bnMbuA6LE .actorPopupMenu{position:absolute;}#mermaid-svg-7tS4HR9bnMbuA6LE .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-7tS4HR9bnMbuA6LE .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7tS4HR9bnMbuA6LE .actor-man circle,#mermaid-svg-7tS4HR9bnMbuA6LE line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-7tS4HR9bnMbuA6LE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} altService 未运行 startService(intent)查找 ServiceRecordonCreate()onStartCommand()返回结果 (可选)

8.2 Activity 与 ContentProvider 的交互

ActivityManagerService ContentProvider Activity ActivityManagerService ContentProvider Activity #mermaid-svg-cGHQc6YH4ICJ84nZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cGHQc6YH4ICJ84nZ .error-icon{fill:#552222;}#mermaid-svg-cGHQc6YH4ICJ84nZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cGHQc6YH4ICJ84nZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cGHQc6YH4ICJ84nZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cGHQc6YH4ICJ84nZ .marker.cross{stroke:#333333;}#mermaid-svg-cGHQc6YH4ICJ84nZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cGHQc6YH4ICJ84nZ p{margin:0;}#mermaid-svg-cGHQc6YH4ICJ84nZ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cGHQc6YH4ICJ84nZ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-cGHQc6YH4ICJ84nZ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-cGHQc6YH4ICJ84nZ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-cGHQc6YH4ICJ84nZ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-cGHQc6YH4ICJ84nZ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-cGHQc6YH4ICJ84nZ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-cGHQc6YH4ICJ84nZ .sequenceNumber{fill:white;}#mermaid-svg-cGHQc6YH4ICJ84nZ #sequencenumber{fill:#333;}#mermaid-svg-cGHQc6YH4ICJ84nZ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-cGHQc6YH4ICJ84nZ .messageText{fill:#333;stroke:none;}#mermaid-svg-cGHQc6YH4ICJ84nZ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cGHQc6YH4ICJ84nZ .labelText,#mermaid-svg-cGHQc6YH4ICJ84nZ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-cGHQc6YH4ICJ84nZ .loopText,#mermaid-svg-cGHQc6YH4ICJ84nZ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-cGHQc6YH4ICJ84nZ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-cGHQc6YH4ICJ84nZ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-cGHQc6YH4ICJ84nZ .noteText,#mermaid-svg-cGHQc6YH4ICJ84nZ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-cGHQc6YH4ICJ84nZ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cGHQc6YH4ICJ84nZ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cGHQc6YH4ICJ84nZ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cGHQc6YH4ICJ84nZ .actorPopupMenu{position:absolute;}#mermaid-svg-cGHQc6YH4ICJ84nZ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-cGHQc6YH4ICJ84nZ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cGHQc6YH4ICJ84nZ .actor-man circle,#mermaid-svg-cGHQc6YH4ICJ84nZ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-cGHQc6YH4ICJ84nZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} acquireProvider(authority)获取 Provider返回 Binder 代理query/insert/update/delete (Binder IPC)


9. Activity 的安全机制

9.1 权限检查模型

Activity 的启动受到系统权限的严格控制。

权限类型 检查时机 学术定义
Normal Permission 安装时授予 低风险权限,系统自动授权
Dangerous Permission 运行时请求 高风险权限,需用户显式同意
Signature Permission 安装时检查签名 相同签名的应用才能访问
System Permission 系统应用专用 只有系统 UID 的应用才能使用

9.2 exported 属性的安全含义

xml 复制代码
<activity
    android:name=".InternalActivity"
    android:exported="false" /> <!-- 仅限应用内部访问 -->

<activity
    android:name=".PublicActivity"
    android:exported="true"> <!-- 允许外部应用访问 -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
    </intent-filter>
</activity>

学术定义

  • exported="false":Activity 不会出现在系统的 Activity 解析列表中,其他应用无法通过隐式 Intent 启动它,防止组件暴露漏洞。
  • exported="true":Activity 可以被外部应用启动,必须做好权限检查和输入验证,防止恶意攻击。

10. Activity 的动画与过渡机制

10.1 窗口动画的执行流程

Activity 切换时的动画由 WindowManagerService 统一管理。
#mermaid-svg-D0K2HDIFpk7ALUN4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-D0K2HDIFpk7ALUN4 .error-icon{fill:#552222;}#mermaid-svg-D0K2HDIFpk7ALUN4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-D0K2HDIFpk7ALUN4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .marker.cross{stroke:#333333;}#mermaid-svg-D0K2HDIFpk7ALUN4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-D0K2HDIFpk7ALUN4 p{margin:0;}#mermaid-svg-D0K2HDIFpk7ALUN4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .cluster-label text{fill:#333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .cluster-label span{color:#333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .cluster-label span p{background-color:transparent;}#mermaid-svg-D0K2HDIFpk7ALUN4 .label text,#mermaid-svg-D0K2HDIFpk7ALUN4 span{fill:#333;color:#333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .node rect,#mermaid-svg-D0K2HDIFpk7ALUN4 .node circle,#mermaid-svg-D0K2HDIFpk7ALUN4 .node ellipse,#mermaid-svg-D0K2HDIFpk7ALUN4 .node polygon,#mermaid-svg-D0K2HDIFpk7ALUN4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-D0K2HDIFpk7ALUN4 .rough-node .label text,#mermaid-svg-D0K2HDIFpk7ALUN4 .node .label text,#mermaid-svg-D0K2HDIFpk7ALUN4 .image-shape .label,#mermaid-svg-D0K2HDIFpk7ALUN4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-D0K2HDIFpk7ALUN4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-D0K2HDIFpk7ALUN4 .rough-node .label,#mermaid-svg-D0K2HDIFpk7ALUN4 .node .label,#mermaid-svg-D0K2HDIFpk7ALUN4 .image-shape .label,#mermaid-svg-D0K2HDIFpk7ALUN4 .icon-shape .label{text-align:center;}#mermaid-svg-D0K2HDIFpk7ALUN4 .node.clickable{cursor:pointer;}#mermaid-svg-D0K2HDIFpk7ALUN4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .arrowheadPath{fill:#333333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-D0K2HDIFpk7ALUN4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D0K2HDIFpk7ALUN4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-D0K2HDIFpk7ALUN4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D0K2HDIFpk7ALUN4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-D0K2HDIFpk7ALUN4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-D0K2HDIFpk7ALUN4 .cluster text{fill:#333;}#mermaid-svg-D0K2HDIFpk7ALUN4 .cluster span{color:#333;}#mermaid-svg-D0K2HDIFpk7ALUN4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-D0K2HDIFpk7ALUN4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-D0K2HDIFpk7ALUN4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-D0K2HDIFpk7ALUN4 .icon-shape,#mermaid-svg-D0K2HDIFpk7ALUN4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D0K2HDIFpk7ALUN4 .icon-shape p,#mermaid-svg-D0K2HDIFpk7ALUN4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-D0K2HDIFpk7ALUN4 .icon-shape .label rect,#mermaid-svg-D0K2HDIFpk7ALUN4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D0K2HDIFpk7ALUN4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-D0K2HDIFpk7ALUN4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-D0K2HDIFpk7ALUN4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} overridePendingTransition
Activity A 结束
WMS 接收动画指令
计算动画帧
SurfaceFlinger 合成图层
显示动画

10.2 共享元素动画(Shared Element Transition)

Android 5.0 引入了共享元素动画,允许两个 Activity 之间的 View 平滑过渡。

学术定义

  • Scene:Activity 的视图状态。
  • Transition:视图状态之间的变化动画。
  • SharedElement :在两个 Scene 中共享的 View,通过 transitionName 标识。

11. Activity 的性能考量(系统级)

11.1 启动时间指标

Activity 的启动时间由两个指标衡量:

指标 定义 学术含义
TTID Time To Initial Display 从 startActivity 到第一帧显示的时间
TTFD Time To Full Display 从 startActivity 到所有内容加载完成的时间

11.2 布局加载的性能瓶颈

Activity 的 setContentView() 是启动时间的瓶颈之一。

学术定义

  • Layout Inflation:解析 XML 并创建 View 对象的过程,消耗 CPU 和内存。
  • Overdraw:像素被多次绘制,浪费 GPU 资源。
  • Hierarchy Depth:视图层级过深,增加 Measure/Layout 的计算量。

12. 关键数据结构与源码定义(续)

12.1 ActivityStack(AMS 中的栈管理)

java 复制代码
// com.android.server.am.ActivityStack
class ActivityStack {
    final int mStackId;
    final ArrayList<TaskRecord> mTaskHistory; // 任务栈历史
    ActivityRecord mResumedActivity;          // 当前 Resumed 的 Activity
    ActivityRecord mPausingActivity;          // 正在 Pause 的 Activity
    ActivityRecord mLastPausedActivity;       // 上一个 Paused 的 Activity
}

12.2 ActivityClientRecord(App 端的记录)

java 复制代码
// android.app.ActivityThread.ActivityClientRecord
static final class ActivityClientRecord {
    IBinder token;                 // Binder 令牌,标识 Activity
    ActivityInfo activityInfo;     // Activity 信息
    Activity activity;             // Activity 实例
    Window window;                // Window 实例
    Bundle state;                 // 保存的状态
}

13. 本篇总结(Knowledge Closure)

关键点 纯学术定义
Activity 的本质 由 AMS 管理的、拥有独立窗口的页面载体。
任务栈的本质 管理 Activity 导航历史的 LIFO 栈结构。
启动模式 系统对 Activity 实例化行为的约束规则。
Window 体系 Activity 通过 PhoneWindow 承载 UI,ViewRootImpl 负责渲染。
启动流程 涉及 AMS、PMS、Zygote、ActivityThread 的多进程协作。
配置变化 系统通过销毁重建 Activity 来适应新的配置。
安全机制 通过 exported 属性和权限检查保护组件。

下一篇预告第二板块:Android 四大组件标准化学理 | 第八篇:Service 后台执行实体与优先级

相关推荐
兰令水1 小时前
leecodecode【区间DP+树形DP】【2026.6.10打卡-java版本】
java·算法·leetcode
weixin199701080162 小时前
[特殊字符] 1688开放平台API Sign签名算法详解(Java / Python / PHP 实现)
java·python·算法
未若君雅裁2 小时前
JVM 垃圾回收算法与分代回收机制
java·jvm·算法
智者知已应修善业2 小时前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
QING6182 小时前
Kotlin 协程新手指南 —— 协程上下文与调度器
android·kotlin·android jetpack
8Qi82 小时前
LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法
java·算法·leetcode·职场和发展·二分查找
8Qi82 小时前
LeetCode 32:最长有效括号 —— 栈 + 标记法 题解
java·数据结构·算法·leetcode·职场和发展··括号匹配
机器学习之心2 小时前
198种组合算法+优化CNN-LSTM+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备
深度学习·算法·cnn-lstm·shap分析·198种组合算法