一句话说透Android里面的Activity、Window、DecorView、View之间的关系

250 阅读2分钟

一句话总结

Activity 是老板,Window 是装修队长,DecorView 是毛坯房,View 是你买的家具。老板喊队长来装修毛坯房,最后把你的家具摆进去!


一、角色分工

角色职责比喻
Activity用户界面的容器,管理生命周期和交互逻辑公司老板,负责指挥大局
Window抽象窗口行为(如视图层级、窗口属性),具体实现为 PhoneWindow装修队长,负责施工方案
DecorView窗口的根视图容器(继承自 FrameLayout),包含系统装饰(状态栏、导航栏)和用户内容。毛坯房(带门窗框架)
View界面元素(如按钮、文本框),组成用户布局的原子组件家具、电器、装饰品

二、协作流程

1. 老板接活(Activity 创建)

  • Activity 诞生:用户点击 App 图标,系统创建 Activity 实例。
  • 找装修队:Activity 内部自动创建一个 PhoneWindow(Window 的实现类)。

2. 毛坯房准备(DecorView 初始化)

  • Window 的活

    1. 创建 DecorView(一个 FrameLayout),包含系统预设的标题栏和内容区域。
    2. 把用户布局(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 就是沙发和床
  • 测量布局加绘制,用户看到美如画!