Window 是什么
Window 是 Android 中窗口的宏观定义,主要是管理 View 的创建,以及与 ViewRootImpl 的交互,将 Activity 与 View 解耦。Window 分三种类型,对应着三种层级,如下表所示:
Window 类型 | 层级范围 | 说明 |
---|---|---|
应用Window | 1 ~ 99 | 对应着一个 Activity |
子 Window | 1000 ~ 1999 | 不能单独存在,需要附属在特定的 Window 之中,例如常见的 PopupDialog,就是子 Window。 |
系统 Window | 2000 ~ 2999 | 需要声明权限才能创建的 Window例如 Toast 和 系统状态栏这些都是系统的 Window |
需要注意,Window 分层的目的是在显示时层级高的会覆盖层级低的窗口。
Window 和 Activity 的关系
应用 Window 表示类是 PhoneWindow,其继承于Window。在应用中,一个 Activity 对应 一个 PhoneWindow。它们的关系如下图所示:
可以看到一个 Activity 对应一个 Window 也就是 PhoneWindow,一个 PhoneWindow 持有一个 DecorView 的实例,DecorView 本身是一个 FrameLayout。
PhoneWindow 的创建和显示流程
完整的 View 显示流程如下图所示:
可以看到,PhoneWindow 是由 Activity 的 attach 方法创建的。在创建完成后,通过 ViewRootImpl 的 setView 方法来往 WindowManagerService
添加 Window。