WindowManagerService之Window类型篇
一:背景
WMS作为窗口管理服务,管理着系统中的所有窗口,窗口的种类有很多:Activity、Dialog、Toast、PopupWindow、StatusBar、NavigationBar、System Alart Window等,那么如此多且繁杂的窗口,是否有比较细致的分类呢?答案是肯定的:有。系统把这些窗口分为了三类:应用窗口、子窗口和系统窗口,下面来看下这三类窗口。
二:窗口类型的定义
窗口类型都是定义在WindowManager的静态内部类LayoutParams中。
2.1 应用窗口
Activity就是典型的应用窗口,应用窗口的定义范围为1-99
public interface WindowManager extends ViewManager {
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
...
//应用窗口起始值
public static final int FIRST_APPLICATION_WINDOW = 1;
//应用窗口的基础值
public static final int TYPE_BASE_APPLICATION = 1;
//普通应用窗口
public static final int TYPE_APPLICATION = 2;
//应用启动窗口,系统在应用启动前显示的窗口,即StartingWindow
public static final int TYPE_APPLICATION_STARTING = 3;
public static final int TYPE_DRAWN_APPLICATION = 4;
//应用窗口最大值
public static final int LAST_APPLICATION_WINDOW = 99;
...
}
}
2.2 子窗口
PopupWindow就是典型的子窗口,子窗口不能单独存在,必须依附于其他窗口(非子窗口),子窗口的定义范围为1000-1999
public interface WindowManager extends ViewManager {
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
...
//子窗口起始值
public static final int FIRST_SUB_WINDOW = 1000;
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;
...
}
}
2.3 系统窗口
StatusBar就是典型的系统窗口,系统窗口的定义范围为2000-2999
public interface WindowManager extends ViewManager {
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
...
//系统窗口起始值
public static final int FIRST_SYSTEM_WINDOW = 2000;
//StatusBar
public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW;
//SearchBar
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;
//Toast
public static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW+5;
...
public static final int TYPE_STATUS_BAR_ADDITIONAL = FIRST_SYSTEM_WINDOW + 41;
//系统窗口最大值
public static final int LAST_SYSTEM_WINDOW = 2999;
...
}
}
三:小结
3.1 窗口类型的定义除了区分不同种类窗口外,还有什么用?
窗口类型(即Type)的值和窗口显示息息相关。SurfaceFlinger显示时,会先对所有窗口进行排序,不同的窗口是以平行于手机屏幕的方式叠加显示的,优先级越高的窗口就离手机屏幕越远(非物理上的远近,只是借用这个概念),Type就影响了窗口的优先级,一般情况下Type越小,窗口的优先级越低,就会被更多的窗口覆盖。