当应用端调用 WindowManager.addView 时,窗口的添加流程正式开启。这是一个跨越应用进程与 WMS 服务端的重要 IPC 过程。
1. 应用端:ViewRootImpl 的建立
在 WindowManagerGlobal 中,每添加一个窗口都会创建一个对应的 ViewRootImpl。它负责:
- 触发第一次
requestLayout。 - 通过
mWindowSession.addToDisplay向 WMS 发起跨进程调用。
2. 服务端:WMS.addWindow 核心逻辑
| 关键步骤 | 内部行为 | 目的 |
|---|---|---|
| 1. 权限与令牌校验 | 检查 WindowToken 是否合法。 |
确保如子窗口、Activity 窗口拥有正确的宿主权限。 |
| 2. 创建 WindowState | 在 WMS 内部为该窗口建立“档案”。 | 存储窗口的所有几何属性、标志位及父子关系。 |
| 3. Z-Order 计算 | 根据 WindowType 分配显示层级。 |
决定窗口在垂直方向上谁盖住谁。 |
| 4. 关联 Session | 将窗口与发起进程的 Session 绑定。 |
便于后续的 IPC 通信与异常清理。 |
3. 核心对象关系图
App 进程 (ViewRootImpl) <— IWindowSession (Binder) —> SystemServer (WMS)
- WMS 持有
WindowToken(管理组) - WindowToken 包含多个
WindowState(管理个体)