Skip to content
阅读进度

Activity、Window、DecorView、ViewRootImpl 各负责什么? ​

返回 View 与显示链路 目录

标准回答 ​

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 是协调器。二者名称相近,但类型和职责不同。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。