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越小,窗口的优先级越低,就会被更多的窗口覆盖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值