一、Window机制的核心模块与职责
Window 机制是 Android 界面系统的核心,它通过三个关键模块实现了应用界面与底层系统服务的解耦。
| 模块 | 比喻 | 核心职责 |
|---|---|---|
PhoneWindow | 分拣中心的控制台 | 管理 DecorView,处理 setContentView()、窗口样式等。 |
ViewRootImpl | 调度员 + 通信员 | 连接 Window 和 WindowManagerService,驱动绘制、事件分发。 |
WindowManager | 快递公司的前台客服 | 提供 API,用于添加/删除窗口,设置窗口属性。 |
二、Window的工作流程:从创建到显示
Window 的生命周期与 Activity 紧密相连,但其工作流程独立且复杂。
1. 创建与布局
- 当
Activity启动时,系统会为其创建一个PhoneWindow实例。 PhoneWindow随后创建一个DecorView,作为整个Window的根视图。DecorView包含了状态栏、标题栏等系统 UI 元素。Activity调用setContentView()方法,PhoneWindow会将用户的布局文件解析并填充到DecorView的内容区域FrameLayout中。
2. 添加到系统
- 在
Activity生命周期进入onResume之后,DecorView会被添加到WindowManager。 WindowManager会创建一个ViewRootImpl实例,并将其与Window和DecorView绑定。ViewRootImpl是连接应用和WindowManagerService的桥梁。ViewRootImpl通过 Binder 调用WindowManagerService,请求在屏幕上创建一个新的窗口。
3. 绘制与合成
WindowManagerService接收到请求后,会分配一块Surface(图形缓冲区)给ViewRootImpl。ViewRootImpl负责驱动measure、layout和draw的完整绘制流程。- 绘制结果会被写入
Surface的Buffer中。 SurfaceFlinger(Android 合成器)会在VSync信号到来时,将所有窗口的Surface合成一个最终的画面,并显示到屏幕上。
三、事件分发与窗口层级管理
- 事件分发:触摸事件从硬件层产生后,首先由
WindowManagerService接收。WindowManagerService根据事件坐标和窗口层级,将事件分发给对应的ViewRootImpl。ViewRootImpl随后将事件传递给DecorView,DecorView负责将其分发给具体的View。 - 窗口层级(Z-Order) :
Window通过类型(TYPE_APPLICATION、TYPE_APPLICATION_OVERLAY等)来管理其在屏幕上的层级。WindowManagerService负责维护这个层级关系,确保高层级的窗口(如Toast、Dialog)始终覆盖在低层级的窗口之上。
四、关键问题解答
-
为什么
Dialog不需要新建Activity?Dialog本质上是一个新的Window,它通过WindowManager的 API 被添加。- 它作为子窗口(通常层级高于
Activity)直接覆盖在Activity窗口之上,从而实现了在同一进程中显示多个窗口。
-
View的宽高在onCreate中为什么是 0?- 因为在
onCreate中,Window的DecorView尚未被添加到WindowManager,ViewRootImpl还没有创建。 View的measure/layout流程是在ViewRootImpl被创建后才被驱动的,因此在onCreate中无法获取宽高。
- 因为在