Android14 AMS 剖析之 Activity 启动分析之 ActivityRecord 的构建

262 阅读4分钟

通俗易懂讲解ActivityRecord的构建过程(基于Android Framework视角)

一、ActivityRecord是什么?

我们可以把ActivityRecord理解为Android系统为每个Activity创建的"身份证"。当你在手机上打开一个App界面时,系统后台会默默为这个界面办理一张身份证,记录它的所有关键信息。这张身份证会伴随Activity的整个生命周期,从创建到销毁。

二、为什么要构建ActivityRecord?

想象一下,如果系统没有这张"身份证",会出现什么问题?

  • 无法管理多个App的界面切换
  • 不知道该把界面显示在哪个任务栈
  • 无法处理返回键的逻辑
  • 进程间通信会混乱

ActivityRecord就像系统管理员的笔记本,记录着每个界面的"户籍信息",让系统能高效管理成百上千个Activity。

三、构建过程详解(分步说明)

1. 发起启动请求(用户点击App图标)

  • 你在桌面点击微信图标,Launcher App会发送启动请求
  • 请求通过Binder IPC穿越到SystemServer进程的AMS服务

2. 创建"身份证"的准备阶段
AMS收到请求后会做这些事:

java
	// 伪代码示例

	public int startActivity(...) {

	    // 解析启动参数(要启动哪个Activity,启动模式等)

	    ActivityStarter starter = obtainStarter(...);

	    

	    // 创建关键对象:ActivityRecord

	    ActivityRecord r = new ActivityRecord(this, callerApp, callingPid, callingUid, 

	                                         callingPackage, intent, resolvedType, aInfo, 

	                                         configuration, resultTo, resultWho, requestCode, 

	                                         componentSpecified, voiceSession != null, 

	                                         mSupervisor, container, options);

	    

	    // 挂载到任务栈管理系统

           ActivityTaskManagerService::startProcessAsync     

	    return START_SUCCESS;

	}

3. 填写身份证信息
系统会为这个ActivityRecord填写详细信息,就像办理身份证时要登记各种信息:

  • 身份信息:Activity类名(com.tencent.mm.ui.LauncherUI)
  • 户籍信息:所属应用包名(com.tencent.mm)
  • 家庭关系:所属任务栈(TaskRecord,默认新开栈)
  • 启动参数:携带的Intent数据(如点击的聊天对象ID)
  • 特殊标记:启动模式(standard/singleTask等)
  • 窗口凭证:appToken(与WMS交互的通行证)

4. 任务栈分配逻辑
系统会根据Activity的启动模式决定如何放置这个"身份证":

  • standard模式:直接放入当前任务栈
  • singleTask模式:查找或新建指定affinity的任务栈
  • singleTop模式:检查栈顶是否已是同个Activity

5. 进程准备阶段
如果目标Activity所在进程未运行:

  • AMS会请求Zygote孵化新进程
  • 新进程启动后会通过ApplicationThread与AMS建立通信
  • AMS通过scheduleLaunchActivity发送包含ActivityRecord信息的Binder调用

6. 客户端创建镜像
App进程收到启动请求后:

  • 创建ActivityClientRecord(客户端的"身份证副本")
  • 通过token与系统服务端的ActivityRecord建立关联
  • 最终实例化真正的Activity对象

四、构建过程的关键参与者

组件角色比喻核心职责
ActivityRecord系统户籍管理员记录Activity所有元数据
TaskRecord家庭户口本管理同一任务栈的Activity集合
ActivityStack社区居委会管理多个任务栈的显示优先级
ActivityTaskManagerService区政府协调所有ActivityStack的管理
AppToken跨进程通行证连接系统服务与客户端Activity

五、构建完成后的状态流转

  1. 初始化状态:INITIALIZING(正在初始化)

  2. 启动阶段

    • PAUSING(暂停原Activity)
    • RESUMED(成为当前活动界面)
  3. 运行阶段

    • 接收触摸事件
    • 更新界面内容
  4. 停止阶段

    • PAUSED(被部分遮挡)
    • STOPPED(完全不可见)
  5. 销毁阶段

    • FINISHING(正在关闭)
    • DESTROYED(从系统注销)

六、实际场景案例分析

场景:从微信聊天页跳转到朋友圈

  1. 创建新身份证

    • 类名:com.tencent.mm.ui.moment.MomentActivity
    • 任务栈:微信主任务栈(taskAffinity="com.tencent.mm")
    • 启动模式:standard(默认)
  2. 状态变更

    • 聊天页:onPause() → RESUMED→PAUSED
    • 朋友圈页:onCreate()→onStart()→onResume()→RESUMED
  3. 返回键处理

    • 朋友圈页出栈,聊天页恢复RESUMED状态
    • 触发onRestart()→onStart()→onResume()

七、设计思想总结

  1. 解耦设计

    • 系统服务层(AMS)与客户端(App)通过ActivityRecord/ActivityClientRecord双胞胎对象解耦
    • 类似银行"存根"设计,系统持主卡,App持副卡
  2. 状态机管理

    mermaid
    	graph TD
    
    	A[INITIALIZING] --> B[PAUSING]
    
    	B --> C[PAUSED]
    
    	C --> D[STOPPING]
    
    	D --> E[STOPPED]
    
    	E --> F[DESTROYING]
    
    	F --> G[DESTROYED]
    
    	C --> H[RESUMED]
    
  3. 性能优化

    • 复用机制:singleTask模式避免重复创建
    • 预加载:通过ActivityRecord提前准备资源
    • 冻结技术:STOPPED状态时暂停非必要渲染

通过这种精心设计的构建流程,Android系统能够高效管理复杂的界面切换,同时保证用户体验的流畅性。理解ActivityRecord的构建过程,对于深入掌握Android Framework的工作原理、进行复杂界面调试和性能优化都至关重要。

#参考资料