Android Window机制:从创建到显示的完整生命周期

282 阅读2分钟

一、Window机制的核心模块与职责

Window 机制是 Android 界面系统的核心,它通过三个关键模块实现了应用界面与底层系统服务的解耦。

模块比喻核心职责
PhoneWindow分拣中心的控制台管理 DecorView,处理 setContentView()、窗口样式等。
ViewRootImpl调度员 + 通信员连接 WindowWindowManagerService,驱动绘制、事件分发。
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 实例,并将其与 WindowDecorView 绑定。ViewRootImpl 是连接应用和 WindowManagerService 的桥梁。
  • ViewRootImpl 通过 Binder 调用 WindowManagerService,请求在屏幕上创建一个新的窗口。

3. 绘制与合成

  • WindowManagerService 接收到请求后,会分配一块 Surface(图形缓冲区)给 ViewRootImpl
  • ViewRootImpl 负责驱动 measurelayoutdraw 的完整绘制流程。
  • 绘制结果会被写入 SurfaceBuffer 中。
  • SurfaceFlinger(Android 合成器)会在 VSync 信号到来时,将所有窗口的 Surface 合成一个最终的画面,并显示到屏幕上。

三、事件分发与窗口层级管理

  • 事件分发:触摸事件从硬件层产生后,首先由 WindowManagerService 接收。WindowManagerService 根据事件坐标和窗口层级,将事件分发给对应的 ViewRootImplViewRootImpl 随后将事件传递给 DecorViewDecorView 负责将其分发给具体的 View
  • 窗口层级(Z-Order)Window 通过类型(TYPE_APPLICATIONTYPE_APPLICATION_OVERLAY 等)来管理其在屏幕上的层级。WindowManagerService 负责维护这个层级关系,确保高层级的窗口(如 ToastDialog)始终覆盖在低层级的窗口之上。

四、关键问题解答

  1. 为什么 Dialog 不需要新建 Activity

    • Dialog 本质上是一个新的 Window,它通过 WindowManager 的 API 被添加。
    • 它作为子窗口(通常层级高于 Activity)直接覆盖在 Activity 窗口之上,从而实现了在同一进程中显示多个窗口。
  2. View 的宽高在 onCreate 中为什么是 0?

    • 因为在 onCreate 中,WindowDecorView 尚未被添加到 WindowManagerViewRootImpl 还没有创建。
    • Viewmeasure/layout 流程是在 ViewRootImpl 被创建后才被驱动的,因此在 onCreate 中无法获取宽高。