Window和DecorView是什么?DecorView又是如何和Window建立联系的?
在 Android 的视图系统中,Window
和 DecorView
是两个核心概念,它们在管理和展示应用界面中起着至关重要的作用。
Window
在 Android 中,Window
是一个抽象概念,它代表一个窗口实体,可以包含视图和视图组。它不是一个视图或视图容器,而是管理视图的一个框架层面的对象,负责事件分发、焦点控制、以及与系统窗口的通信。每个 Android 应用至少有一个窗口,即主窗口,但可以包含多个窗口(例如对话框、下拉列表等)。
DecorView
DecorView
是窗口的根视图,它是 ViewGroup
的一个实现,包含应用内容的整个视图层次结构。它包括标题栏(如果有的话)和应用内容视图。DecorView
本质上是整个 Android 窗口视图层次的容器。
DecorView 和 Window 的联系
DecorView
是通过 Window
类与窗口建立联系的。当一个应用的 Activity 启动时,系统会为它创建一个 Window
实例,通常是 PhoneWindow
类的实例。这个过程涉及以下几个步骤:
- 创建 Window:
- 当 Activity 启动时,会通过
Activity.attach()
方法关联一个Window
(通常是PhoneWindow
)。这个方法会为 Activity 设置布局参数、窗口管理器等。
- 当 Activity 启动时,会通过
- 设置 Content View:
- Activity 的内容设置是通过调用
Activity.setContentView()
实现的。这个方法实际上是调用了Window
的setContentView()
方法。
- Activity 的内容设置是通过调用
- 生成 DecorView:
- 在
Window.setContentView()
方法内部,Window
首先检查是否已经创建了DecorView
。如果没有,它会创建一个DecorView
并将其设置为窗口的根视图。 - 然后,
Window
将通过WindowManager
将DecorView
添加到系统窗口中。
- 在
- 视图渲染:
DecorView
渲染其包含的视图层次结构(包括应用指定的内容视图和可能的窗口装饰,如标题栏)。- 用户交互和绘制都是通过
DecorView
进行协调和处理的。
通过这种方式,DecorView
作为一个桥梁将 Window
的抽象功能与实际的视图层次结构相连接,允许 Window
管理视图,同时将事件分发、视图绘制等工作委托给 DecorView
。因此,DecorView
是连接 Android 布局管理和系统窗口管理之间的关键环节。