一句话总结:
Activity 是老板,Window 是装修队长,DecorView 是毛坯房,View 是你买的家具。老板喊队长来装修毛坯房,最后把你的家具摆进去!
一、角色分工
角色 | 职责 | 比喻 |
---|---|---|
Activity | 用户界面的容器,管理生命周期和交互逻辑 | 公司老板,负责指挥大局 |
Window | 抽象窗口行为(如视图层级、窗口属性),具体实现为 PhoneWindow | 装修队长,负责施工方案 |
DecorView | 窗口的根视图容器(继承自 FrameLayout ),包含系统装饰(状态栏、导航栏)和用户内容。 | 毛坯房(带门窗框架) |
View | 界面元素(如按钮、文本框),组成用户布局的原子组件 | 家具、电器、装饰品 |
二、协作流程
1. 老板接活(Activity 创建)
- Activity 诞生:用户点击 App 图标,系统创建 Activity 实例。
- 找装修队:Activity 内部自动创建一个
PhoneWindow
(Window 的实现类)。
2. 毛坯房准备(DecorView 初始化)
-
Window 的活:
- 创建
DecorView
(一个 FrameLayout),包含系统预设的标题栏和内容区域。 - 把用户布局(XML 文件)塞进
DecorView
的content
区域。
- 创建
-
关键代码:
// Activity.java public void setContentView(int layoutResID) { getWindow().setContentView(layoutResID); // Window 负责加载布局到 DecorView }
3. 买家具摆进去(View 的添加)
-
你的布局:通过 XML 或代码定义的按钮、文本框等,最终被解析成
View
对象树。 -
摆放规则:
DecorView
是根容器,包含系统 UI 和你的内容区域。- 你的布局作为子 View 被添加到
content
区域。
4. 展示给用户(界面渲染)
- 测量:计算每个 View 的大小(比如按钮多宽)。
- 布局:确定每个 View 的位置(比如标题在顶部)。
- 绘制:把内容画到屏幕上。
三、层级关系图
Activity
└── Window(PhoneWindow)
└── DecorView(根容器)
├── 系统 UI(状态栏、导航栏)
└── Content(FrameLayout)
└── 你的布局(TextView、Button...)
四、通俗问答
1. 为什么需要这么多层级?直接让 Activity 管 View 不行吗?
- 解耦:各司其职,Activity 专注业务逻辑,Window 管显示规则,View 管具体渲染。
- 灵活性:Window 可以替换不同风格的 DecorView(比如全屏、对话框),View 可复用。
2. setContentView() 到底干了啥?
- 装修队长接单:Window 把 XML 布局解析成 View 树,塞进 DecorView 的
content
区域。 - 老板不用动手:Activity 只负责调用方法,具体脏活累活交给 Window。
3. DecorView 和 View 的区别?
- DecorView:是 View 的容器(本质是 FrameLayout),自带系统 UI 框架。
- View:具体的视觉元素(按钮、文字),由开发者定义。
五、总结口诀
- Activity 是老板,Window 是工头
- DecorView 毛坯房,系统 UI 带框框
- setContentView 塞家具,View 就是沙发和床
- 测量布局加绘制,用户看到美如画!