WindowManagerService (WMS) 是 Android 系统中负责窗口 management 的核心服务。它主要处理窗口的布局、显示次序、窗口动画以及输入事件的派发。
1. WMS 的职责
WMS 的主要工作可以概括为以下四个核心领域:
| 职责领域 | 核心功能描述 |
|---|---|
| 窗口管理 | 控制窗口的添加、删除、更新,并维护窗口的层级(Z-Order)关系。 |
| 窗口布局 | 根据窗口属性(LayoutParams)动态计算每个窗口在屏幕上的大小和位置。 |
| 输入事件中转 | 作为输入系统的中间站,协助 InputManagerService 将触控等事件派发给正确的窗口。 |
| 动画与渲染 | 管理窗口切换动画,并与 SurfaceFlinger 协作完成最终屏幕内容的渲染绘制。 |
2. 核心类解析
理解 WMS 的源码,必须先搞清楚这几个核心类及其职责:
| 核心类 | 职责描述 |
|---|---|
| Window (PhoneWindow) | 屏幕窗口的抽象,承载了 ViewTree 及 DecorView。 |
| WindowManager | 应用端操作窗口的入口,负责与 WMS 通信。 |
| WMS | 服务端核心,负责全局窗口调度、布局、动画及输入分发。 |
| Session | 应用进程与 WMS 通信的单向 Binder 通道。 |
| WindowState | WMS 服务端窗口实体,存储了窗口的几何属性及状态信息。 |
| WindowToken | 窗口令牌,用于标识和组织一组相关的窗口(如 Activity 的所有窗口)。 |
3. 窗口的层级管理 (Z-Order)
WMS 使用 WindowType 来区分窗口的层级。层级越高,显示在越上层:
| 窗口类型 | 层级范围 (Z-Order) | 典型示例 | 备注 |
|---|---|---|---|
| 应用窗口 | 1 - 99 | Activity 窗口 | 基础窗口类型 |
| 子窗口 | 1000 - 1999 | PopupWindow, Dialog | 必须依附于父窗口 |
| 系统窗口 | 2000 - 2999 | StatusBar, Toast, Alert | 通常需要特定系统权限 |
4. 窗口添加流程简述
当我们在 Activity 中调用 setContentView 后,窗口诞生的核心步骤如下:
| 关键步骤 | 执行角色 | 核心行为 |
|---|---|---|
| 创建核心纽带 | ViewRootImpl |
创建实例,作为连接 WindowManager 与 DecorView 的纽带。 |
| 发起布局请求 | 应用进程 | 调用 requestLayout 触发视图树的测量、布局与绘制流程。 |
| 跨进程添加 | WMS |
通过 IWindowSession 发起 IPC,在服务端创建 WindowState 并分配显示层级。 |
5. 接下来我们将深入探讨
- WMS 的启动流程
- Surface 的创建与渲染链路
- WMS 动画框架解析