在 Android 系统中,窗口(Window)按照功能和层级可分为以下几大类:
1. **应用窗口(Application Windows)**
- 这是最常见的一类窗口,代表了应用程序的主要视图界面,例如 Activity 窗口。每当启动一个新 Activity 时,系统都会为其创建一个新的应用窗口。应用窗口的 Z-order(堆叠顺序)位于系统窗口之下,子窗口之上。
2. **子窗口(Sub-windows)**
- 子窗口是依附于应用窗口之上的附加窗口,它们通常嵌入在 Activity 的布局中,或者暂时出现在 Activity 之上。例如,PopupWindow、Dialog、ContextMenu、OptionMenu 等都是子窗口的例子。子窗口的 Z-order 高于应用窗口,但低于系统窗口。
3. **系统窗口(System Windows)**
- 系统窗口拥有最高的 Z-order,它们通常由系统服务创建和管理,可以覆盖在所有应用窗口之上。这类窗口包括但不限于:
- 状态栏(StatusBar):显示时间、电池状态、通知等系统信息。
- 导航栏(NavigationBar):包含 Home、Back 和 Recent Apps 等按键。
- 输入法(Input Method):虚拟键盘弹出时显示。
- Toast:短时显示的提示信息。
- 通知栏(Notification shade):从顶部下拉显示的通知中心。
- 快速设置面板(Quick Settings):进一步下拉显示的快捷设置选项。
窗口的层级关系决定了它们在屏幕上的显示顺序和相互覆盖关系,一般来说,层级越高(type 值越大)的窗口会显示在顶部,遮盖住层级较低的窗口。应用程序可以通过 WindowManager 的 API 来添加、移除和控制窗口的行为。
在 Android 中,当我们讨论窗口(Window)的类型(type)时,主要是指 WindowManager.LayoutParams 中的 `type` 属性。这个属性定义了窗口所属的类别,进而决定其在窗口堆栈中的层级、行为以及其他窗口对其的遮挡关系。
WindowManager.LayoutParams 中的 `type` 常见取值包括:
1. **应用窗口类型(Application Windows)**
- `TYPE_APPLICATION`
- `TYPE_APPLICATION_PANEL`(应用面板窗口,例如:popupWindow)
- `TYPE_APPLICATION_MEDIA`(媒体播放窗口)
- `TYPE_APPLICATION_SUB_PANEL`(子面板窗口)
2. **子窗口类型(Sub-windows)**
- `TYPE_PHONE`(电话窗口,例如拨号盘)
- `TYPE_TOAST`(Toast 窗口)
- `TYPE_SYSTEM_ALERT`(系统警报窗口)
- `TYPE_SYSTEM_DIALOG`(系统对话框窗口)
3. **系统窗口类型(System Windows)**
- `TYPE_STATUS_BAR`(状态栏)
- `TYPE_NAVIGATION_BAR`(导航栏)
- `TYPE_SYSTEM_OVERLAY`(系统覆盖层,如一些悬浮窗效果)
- `TYPE_INPUT_METHOD`(输入法窗口)
窗口类型 `type` 的值越小,窗口的层级就越低,越容易被其他窗口遮挡;反之,值越大,窗口的层级越高,更容易覆盖在其他窗口之上。此外,不同类型窗口还受到权限和安全策略的限制,例如普通应用一般不允许创建系统类型的窗口。