外观
Activity、Window、DecorView、ViewRootImpl 各负责什么?
标准回答
Activity 负责页面生命周期和交互入口;Window 表示窗口级的界面与配置;DecorView 是窗口里的顶层 View 容器,应用内容通常放在它的内容区域;ViewRootImpl 则协调这棵 View 树的遍历、输入,以及与窗口系统的交互。
例如 setContentView 把你的布局放入窗口内容区域,但不是 Activity 自己调用每个按钮的 onDraw。后续由框架通过 ViewRootImpl 组织 View 树工作。ViewRootImpl 虽然名字带 View,也不是一个 View 或 ViewGroup,它实现的是连接与调度职责。
WindowManagerService 位于系统服务侧,负责窗口管理相关策略和状态;它不替每个 TextView 排版和绘字。应用负责生产自己的内容,系统负责管理窗口并协调显示。
关键机制
- 普通 Activity 的 Window 常由 PhoneWindow 实现;这是框架实现概念,业务通常面向 Window API。
- 一个进程可能有多个窗口和对应 ViewRootImpl,不能把它理解为整个应用只有一个全局根。
- Dialog、独立弹窗等可能产生额外窗口;普通 ViewGroup 增加一个孩子则不等于新增系统窗口。
通俗例子
页面里增加一个 TextView,是修改原窗口的 View 树;弹出一个拥有独立窗口的 Dialog,则还会出现另一套窗口内容与根协调关系。
追问与回答
WMS 会调用每个 View 的 onDraw 吗?
不会。WMS 管理窗口相关状态和策略,具体 View 树的测量、布局与绘制在应用进程中完成。系统拿到的是应用生产的窗口内容和图层状态,而不是逐个帮按钮执行 Java 绘图代码。
易混淆点
DecorView 是 View 树根容器;ViewRootImpl 是协调器。二者名称相近,但类型和职责不同。
参考资料
内容来源
- Android 技术札记 · 原条目
window-view-root