我们在实际过程中,经常会遇到不同的窗口,Activity、Dialog、Toast、输入法界面等,窗口可以分为三大类:Application Window、Sub Window、System Window。下面简单介绍下窗口的三大类型。
窗口类型定义在WindowManager.java的内部类LayoutParams中,类型如下
1.Application Window应用程序窗口
这类窗口一般是应用程序的窗口,比方说应用程序的Activity
frameworks/base/core/java/android/view/WindowManager.java的LayoutParams内部类
public static final int FIRST_APPLICATION_WINDOW = 1;//代表普通应用程序窗口的窗口类型的开始值
public static final int TYPE_BASE_APPLICATION = 1;//应用程序窗口的基础值,其他窗口的值都要大于这个值
public static final int TYPE_APPLICATION = 2;//普通应用程序窗口
public static final int TYPE_APPLICATION_STARTING = 3;//应用程序启动时显示的特殊应用程序窗口
public static final int TYPE_DRAWN_APPLICATION = 4;//TYPE_APPLICATION 的变体,确保窗口管理器在显示应用程序之前等待此窗口绘制
public static final int LAST_APPLICATION_WINDOW = 99;//应用程序窗口类型的结束。
所以,Application Window的type值范围是1~99
2.Sub Window子窗口
这类窗口无法独立存在,需要依附其他类型窗口,一般是Activity里面的窗口,比如各类菜单窗口等
public static final int FIRST_SUB_WINDOW = 1000;//表示子窗口类型的开始值,子窗口的Z序和坐标空间都依赖于Activity窗口。
public static final int TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW;//面板窗口。 这些窗口出现在其附加窗口的上传。
public static final int TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW + 1;//用于显示媒体(如视频)的窗口。 这些窗口显示在其附加窗口的下层。
public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW + 2;//应用程序窗口的子面板,显示于所有面板窗口的上层。
public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW + 3;//和面板窗口类似,但窗口的布局是作为顶级窗口的布局,而不是作为其容器的子窗口。
public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW + 4;//用于在媒体窗口顶部显示叠加层的窗口,需要实现透明(半透明)效果,例如:字幕
public static final int TYPE_APPLICATION_ABOVE_SUB_PANEL = FIRST_SUB_WINDOW + 5;//应用程序窗口顶部的子面板及其子面板窗口
public static final int LAST_SUB_WINDOW = 1999;//子窗口类型结束值
Sub Window窗口的type值范围是1000~1999
3.System Window系统窗口
这类窗口一般是系统创建,比方说状态栏、通知栏、Toast、输入法、Wallpaper等
public static final int FIRST_SYSTEM_WINDOW = 2000;//系统窗口的开始值
public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW;//状态栏。 状态栏窗口只能有一个,它位于屏幕顶部,所有其他窗口都向下移动,位于屏幕下方
public static final int TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1;//搜索栏。 搜索栏窗口只能有一个; 它位于屏幕顶部。
public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;//电话。这些是非应用程序窗口,提供用户与电话的交互(特别是来电)这类窗口通常放置在所有应用程序上方,但位于状态栏后面
public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3;//系统窗口,如低电量警报。 这些窗口始终位于应用程序窗口的顶部。
public static final int TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW+4;//锁屏窗口
public static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW+5;//Toast窗口。用于显示toast
public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6;//系统覆盖窗口,需要显示在其他所有内容之上。 这些窗口不得获取输入焦点,否则会干扰锁屏
public static final int TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW+7;//电话优先,即使是处于锁屏状态也要显示,但是不能获取焦点,否则会干扰锁屏
public static final int TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW+8;//系统对话框
public static final int TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW+9;//锁屏时显示的对话框
public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10;//内部系统错误窗口,出现在所有可能的内容之上。
public static final int TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW+11;//输入法窗口,出现在普通ui上。 应用程序窗口可以调整大小或平移,以在显示此窗口时保持输入焦点可见
public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW+12;//输入法对话框窗口,出现在当前输入法窗口上方。
public static final int TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW+13;//壁纸窗口,放置在任何想要位于壁纸之上的窗口后面。
public static final int TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW+14;//从状态栏上方滑出的面板
public static final int TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+15;//安全系统覆盖窗口,需要显示在其他所有内容之上。 这些窗口不得获取输入焦点,否则会干扰锁屏
public static final int TYPE_DRAG = FIRST_SYSTEM_WINDOW+16;//drag窗口
public static final int TYPE_STATUS_BAR_SUB_PANEL = FIRST_SYSTEM_WINDOW+17;//从状态栏上方滑出的子面板
public static final int TYPE_POINTER = FIRST_SYSTEM_WINDOW+18;//鼠标窗口
public static final int TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW+19;//导航栏
public static final int TYPE_VOLUME_OVERLAY = FIRST_SYSTEM_WINDOW+20;//当用户更改系统音量时显示的音量级别覆盖/对话框。
public static final int TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW+21;//进度条
public static final int TYPE_INPUT_CONSUMER = FIRST_SYSTEM_WINDOW+22;//当系统UI栏隐藏时消耗输入事件的窗口类型。
public static final int TYPE_NAVIGATION_BAR_PANEL = FIRST_SYSTEM_WINDOW+24;//导航栏面板
public static final int TYPE_DISPLAY_OVERLAY = FIRST_SYSTEM_WINDOW+26;//显示覆盖窗口。 用于模拟辅助显示设备。
public static final int TYPE_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW+27;//放大叠加窗口。 用于在启用辅助功能放大功能时突出显示显示的放大部分。
public static final int TYPE_PRIVATE_PRESENTATION = FIRST_SYSTEM_WINDOW+30;//私有虚拟显示器顶部的演示窗口。
public static final int TYPE_VOICE_INTERACTION = FIRST_SYSTEM_WINDOW+31;//语音交互层的窗口。
public static final int TYPE_ACCESSIBILITY_OVERLAY = FIRST_SYSTEM_WINDOW+32;//无障碍窗口,可以在所有的应用程序之上展示。
public static final int TYPE_VOICE_INTERACTION_STARTING = FIRST_SYSTEM_WINDOW+33;//语音交互层的启动窗口。
public static final int TYPE_DOCK_DIVIDER = FIRST_SYSTEM_WINDOW+34;//调整分屏模式下每个窗口大小的分割线
public static final int TYPE_QS_DIALOG = FIRST_SYSTEM_WINDOW+35;//快捷设置弹窗
public static final int TYPE_SCREENSHOT = FIRST_SYSTEM_WINDOW + 36;//截屏窗口
public static final int TYPE_PRESENTATION = FIRST_SYSTEM_WINDOW + 37;//用于演示的窗口。
public static final int TYPE_APPLICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 38;//应用程序覆盖窗口,显示在所有Activity窗口上方,但位于关键系统窗口(如状态栏或 IME)下方。
public static final int TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 39;//用于在其他窗口上方添加辅助窗口放大功能的窗口。
这会将窗口放置在覆盖窗口中。
public static final int TYPE_NOTIFICATION_SHADE = FIRST_SYSTEM_WINDOW + 40;//通知栏
public static final int TYPE_STATUS_BAR_ADDITIONAL = FIRST_SYSTEM_WINDOW + 41;//用于在屏幕的非常规部分(即屏幕的左侧或底部)显示状态栏。
public static final int LAST_SYSTEM_WINDOW = 2999;//系统窗口的结束值
System Window窗口的type值范围是2000~2999