当前位置: 首页 > news >正文

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

相关文章:

  • 【资料分享】清华大学-187页:AIGC发展研究3.0版
  • Mysql 数据库免费使用
  • Java高频面试之集合-03
  • unity6 打包webgl注意事项
  • Vue3多页面跳转
  • 低代码+AI双重革命:传统软件开发的破局与重生
  • 四款GIS工具箱软件解析:满足企业多样化空间数据需求
  • SPI硬件设计及通信原理解析
  • FLEXOO的传感器技术:从材料选择到生产工艺的全方位创新
  • Cursor+Claude3.7实现从原型到app开发
  • 软考中级-数据库-3.3 数据结构-树
  • 网络安全数据富化 网络数据安全处理规范
  • Windows零门槛部署DeepSeek大模型:Ollama+7B参数模型本地推理全攻略
  • Ubuntu系统安装Apache2方法
  • 2.数据结构-栈和队列
  • 蓝桥杯C组真题——巧克力
  • STM32之ADC
  • 【文生图】windows 部署stable-diffusion-webui
  • uniapp:小程序将base64图片字符串保存到手机相册
  • Object.defineProperty()
  • 中华人民共和国和巴西联邦共和国关于强化携手构建更公正世界和更可持续星球的中巴命运共同体,共同维护多边主义的联合声明
  • 上海团队在医学顶刊连发两文,率先提出“证据污染”循证概念
  • 220名“特朗普币”持有者花1.48亿美元,获邀与特朗普共进晚餐
  • 讲一个香港儿童的故事,《劏房的天空》获“周庄杯”特等奖
  • 极限拉扯上任巴西,安切洛蒂开启夏窗主帅大挪移?
  • 美英贸易协议|不,这不是一份重大贸易协议