WMS 的初始化与核心职责 WMS(WindowManagerService)是 Android 窗口系统的核心,负责窗口的创建、布局、显示与交互管理,其初始化过程与 SystemServer 深度绑定,需协调多个系统服务构建完整的窗口管理体系。 WMS 的初始化流程 WMS 初始化始于 SystemServer 的 startOtherServices() 方法,主要步骤包括:
- 实例创建与基础配置:通过 WindowManagerService.main() 创建 WMS 实例,初始化核心成员变量(如 mRoot 为根窗口容器、mPolicy 为窗口策略),设置显示参数(屏幕分辨率、密度),并注册到 ServiceManager(Binder 服务名为 “window”)。
- 跨服务依赖建立:与 DisplayManagerService(DMS)绑定,获取显示设备列表(如主屏幕、外接显示器);与 InputManagerService(IMS)建立通信,注册输入事件接收器(用于窗口触摸事件分发);与 AMS 关联,接收 Activity 窗口创建请求。
- 策略与容器初始化:加载 WindowManagerPolicy(定义窗口行为规则,如状态栏高度、导航栏位置,不同设备厂商可定制),创建窗口层级容器(如 mAboveAppWindows 存放系统窗口、mAppWindows 存放应用窗口),初始化窗口动画管理器(WindowAnimator)与 ace 控制器(aceControl)。
- 系统窗口创建:启动后创建必要的系统窗口,如状态栏(StatusBar)、导航栏(NavigationBar),这些窗口具有固定层级(通常最高),优先于应用窗口显示。 WMS 的核心职责
- 窗口创建与管理:接收应用通过 WindowManager.addView() 发送的窗口创建请求,验证窗口类型权限(如系统窗口需 SYSTEM_ALERT_WINDOW 权限),分配唯一 WindowState 记录窗口属性(尺寸、位置、类型、Z-order),并将其加入对应层级的窗口容器。
- 窗口布局与排版:根据窗口属性(LayoutParams)、屏幕尺寸与层级规则,通过 WindowLayout 模块计算窗口位置与大小。支持窗口自适应(如旋转屏幕时重布局)、多窗口分屏(如 Android 7.0 后的 Split-Screen)与窗口约束(如禁止超出屏幕边界)。
- 窗口显示控制:管理窗口可见性(setVisibility()),通过 aceControl 向 aceFlinger 提交窗口的显示 / 隐藏状态;控制窗口动画(如进入 / 退出动画、转场动画),通过 WindowAnimator 计算动画帧并同步至 aceFlinger。
- 输入事件分发:与 IMS 协同,接收触摸、按键等输入事件,根据窗口层级与坐标判断事件目标窗口(如顶层可见窗口优先接收),通过 Binder 将事件转发至应用的 ViewRootImpl,触发 onTouchEvent() 等回调。
WMS 是连接应用界面与底层渲染的关键枢纽,其设计需兼顾功能性(如多窗口)、性能(如布局效率)与用户体验(如动画流畅度),是 Android 可视化交互的核心支撑。