WMS 核心概念与窗口管理流程

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 动画框架解析
, ,