安卓中的画面不是纯粹由window组成。而是改成了window+view的组织模式。window是一个顶层窗口的概念。view就相当于在window内的控件。而subwindow则是依附于window的一些对话框。安卓在对window进行管理的时候,将window分为很多层,不同的层又对应于不同的window类型。下面这个图阐释了这种概念:


安卓首先将窗口按照layer分层,然后每一层又有很多window,每一个window又包含了很多的view和sublayer。这些分层的概念对于用户端是透明的,用户端只知道windowType,这样,用户就能通过

windowType的命名从直观概念上知道窗口大概表现出来是什么样子的。下面是windowTYpe转换为

layer的函数:

   public int windowTypeToLayerLw(int type) {
if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) {
return APPLICATION_LAYER;
}
switch (type) {
case TYPE_STATUS_BAR:
return STATUS_BAR_LAYER;//14
case TYPE_STATUS_BAR_PANEL:
return STATUS_BAR_PANEL_LAYER;//15
case TYPE_STATUS_BAR_SUB_PANEL:
return STATUS_BAR_SUB_PANEL_LAYER;//13
case TYPE_SYSTEM_DIALOG:
return SYSTEM_DIALOG_LAYER;//5
case TYPE_SEARCH_BAR:
return SEARCH_BAR_LAYER;//4   //4
case TYPE_PHONE:
return PHONE_LAYER;//3  //3
case TYPE_KEYGUARD:
return KEYGUARD_LAYER;//11
case TYPE_KEYGUARD_DIALOG:
return KEYGUARD_DIALOG_LAYER;//12
case TYPE_SYSTEM_ALERT:
return SYSTEM_ALERT_LAYER;//8
case TYPE_SYSTEM_ERROR:
return SYSTEM_ERROR_LAYER;//19
case TYPE_INPUT_METHOD:
return INPUT_METHOD_LAYER;//9
case TYPE_INPUT_METHOD_DIALOG:
return INPUT_METHOD_DIALOG_LAYER;//10
case TYPE_VOLUME_OVERLAY:
return VOLUME_OVERLAY_LAYER;//16
case TYPE_SYSTEM_OVERLAY:
return SYSTEM_OVERLAY_LAYER;//17
case TYPE_SECURE_SYSTEM_OVERLAY:
return SECURE_SYSTEM_OVERLAY_LAYER;//21
case TYPE_PRIORITY_PHONE:
return PRIORITY_PHONE_LAYER;//7
case TYPE_TOAST:
return TOAST_LAYER;//6
case TYPE_WALLPAPER:
return WALLPAPER_LAYER;// 2
case TYPE_DRAG:
return DRAG_LAYER;//20
case TYPE_POINTER:
return POINTER_LAYER; //23
case TYPE_NAVIGATION_BAR:
return NAVIGATION_BAR_LAYER;//18
case TYPE_BOOT_PROGRESS:
return BOOT_PROGRESS_LAYER; //22
case TYPE_HIDDEN_NAV_CONSUMER:
return HIDDEN_NAV_CONSUMER_LAYER; //24
}
Log.e(TAG, "Unknown window type: " + type);
return APPLICATION_LAYER;
}

很多人看到这个后不知道怎么分析,一下子被从2到24层的结构吓坏了。那么我就分析一下,这些层次关系。我们只要找到一个突破点,那就是锁屏所在的层,而在锁屏之上的层暂时不要关心:

case TYPE_KEYGUARD:
            return KEYGUARD_LAYER;//11

锁屏之下的层依次为:

//输入法对话框

case TYPE_INPUT_METHOD_DIALOG:
            return INPUT_METHOD_DIALOG_LAYER;//10

//输入法

case TYPE_INPUT_METHOD:
            return INPUT_METHOD_LAYER;//9

//系统警告[低电等]

case TYPE_SYSTEM_ALERT:
            return SYSTEM_ALERT_LAYER;//8

//  case TYPE_PRIORITY_PHONE:
            return PRIORITY_PHONE_LAYER;//7

case TYPE_TOAST:
            return TOAST_LAYER;//6

case TYPE_SYSTEM_DIALOG:
            return SYSTEM_DIALOG_LAYER;//5

case TYPE_SEARCH_BAR:
            return SEARCH_BAR_LAYER;//4   //4

case TYPE_PHONE:
            return PHONE_LAYER;//3  //3

if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) {
            return APPLICATION_LAYER;
        }

case TYPE_WALLPAPER:
            return WALLPAPER_LAYER;// 2

从上可以看出,大部分是可以理解的。只有如下两种不好理解:

TYPE_PHONE 3  和   TYPE_PRIORITY_PHONE 7, 很明显与电话有关。

TYPE_PHONE 3 这个基本上没有使用只有在CompatModeDialog用了一下,而TYPE_PRIORITY_PHONE 则是锁网用的。这样可以给运营商带来更多福利。

2.KEYGUARD_LAYER之上又是什么呢?依次如下:

case TYPE_KEYGUARD_DIALOG:
            return KEYGUARD_DIALOG_LAYER;//12 关机时候使用

case TYPE_STATUS_BAR_SUB_PANEL:
            return STATUS_BAR_SUB_PANEL_LAYER;//13

case TYPE_STATUS_BAR:
            return STATUS_BAR_LAYER;//14

case TYPE_STATUS_BAR_PANEL:
            return STATUS_BAR_PANEL_LAYER;//15

case TYPE_VOLUME_OVERLAY:
            return VOLUME_OVERLAY_LAYER;//16

case TYPE_SYSTEM_OVERLAY:
            return SYSTEM_OVERLAY_LAYER;//17

这些为一类,都好理解。从 SYSTEM_OVERLAY_LAYER往下,基本上就是不常见的了

case TYPE_NAVIGATION_BAR:
            return NAVIGATION_BAR_LAYER;//18

case TYPE_SYSTEM_ERROR:
            return SYSTEM_ERROR_LAYER;//19

case TYPE_DRAG:
            return DRAG_LAYER;//20

case TYPE_SECURE_SYSTEM_OVERLAY:
            return SECURE_SYSTEM_OVERLAY_LAYER;//21

case TYPE_BOOT_PROGRESS:
            return BOOT_PROGRESS_LAYER; //22

case TYPE_POINTER:
            return POINTER_LAYER; //23

case TYPE_HIDDEN_NAV_CONSUMER:
            return HIDDEN_NAV_CONSUMER_LAYER; //24

可以看出大部分的对话框无法加在锁屏之上。那么有些对话框希望在锁屏的时候能显示,同时,在不锁屏的时候又能保持按照一般对话框来处理。该如何办呢?例如电话,闹钟等。第一种方法,动态改变window的type。根据当前是否正在锁屏,来设置不同的layer来处理。第二种,在锁屏的时候,如果启动了这种window,就隐藏掉锁屏。等这种window被remove走之后,再显示锁屏。

  • 大小: 18.4 KB
  • 查看图片附件

[置顶] 安卓高手之路之 WindowManager相关推荐

  1. [置顶] 安卓高手之路之ClassLoader(二)

    因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...

  2. 安卓高手之路之 WindowManager

    安卓中的画面不是纯粹由window组成.而是改成了window+view的组织模式.window是一个顶层窗口的概念.view就相当于在window内的控件.而subwindow则是依附于window ...

  3. 安卓高手之路 图形系统(4 Measure的算法)

    安卓高手之路 图形系统(4 Measure的算法) - 修补C++ - ITeye技术网站 Java代码   /** * Does the hard part of measureChildren:  ...

  4. 安卓高手之路 图形系统(2)----------------基于Binder的架构思路)

    在学习安卓的时候最迷惑的就是Binder.图形框架的理解与Binder的理解分不开.前面一篇 [ 安卓高手之路之java层Binder 从代码角度分析了Java层Binder的实现原理.在C++层,这 ...

  5. 安卓高手之路之 ClassLoader

    我不喜欢那些泛泛而谈的去讲那些形而上学的道理,更不喜欢记那些既定的东西.靠记忆去弥补思考的人,容易陷入人云亦云的境地,最后必定被记忆所围困,而最终消亡的是创造力.希望这个高手之路系列能够记录我学习安卓 ...

  6. 安卓高手之路之 图形系统之 图形框架(1)

    安卓图形系统理解起来并不容易.那是因为系统对于数据的封装非常多,图形模块与输入输出,应用程序管理等模块参杂在一起.让开发者很难摸清其中的脉络.下面先给出最简单的一张图.             这张图 ...

  7. 安卓高手之路之图形系统(6)ListView继续

    综述: 本篇首先介绍了ListView的实现细节.然后介绍了Gallery,ListView,ViewPager的效率对比分析.以及效率低下的原因.最后给出了一些解决方案. 1.在上一篇讨论了requ ...

  8. 安卓高手之路之图形系统【5】安卓ListView和EditText配合使用时的注意事项。

    ListView实现滚动和布局时的注意实现: 1.如何实现自动定位到底部: android:stackFromBottom="true" 这样ListView就可以实现从底向上增长 ...

  9. 安卓高手之路之(架构设计)

    今天 现安卓的原生代码可能存在多线程不安全. ItemInfo是个共享的数据.但是却没有锁.为何.....

最新文章

  1. 支付宝的kill-ie
  2. elasticsearch query delete 方法
  3. Python切片各种情况详解
  4. scrapy爬虫系列之三--爬取图片保存到本地
  5. c++ java通信 protocol buffer,google protocol buffer (C++,Java序列化应用实例)
  6. pycharm 快捷键大全
  7. Javascript的错误处理
  8. 无需安装Oracle,用PL/SQL直接连接Oracle服务器
  9. 让WebStorm支持dojo的智能提示
  10. 如何在SQL Server中处理过多的SOS_SCHEDULER_YIELD等待类型值
  11. 涨知识!Google 黑客常用搜索语句一览 | 原力计划
  12. UVA11361 Investigating Div-Sum Property
  13. BackTrack5 下破解无线
  14. ext2文件系统源代码之balloc.c文件解析
  15. 博世传感器调试笔记(二)加速度及陀螺仪传感器BMI160
  16. 打开UG8.0出现启动界闪一下就没有任何反应了怎么回事?
  17. php 导出 设置多表头,PHP Excel 导出文件,自定义表头
  18. 基于JSP的汽车租赁管理系统的设计与实现
  19. MKR:协同过滤算法效果不佳,知识图谱来帮忙
  20. 最强损失函数分析:一般自适应鲁棒损失函数

热门文章

  1. linux 代码获取当前路径,【linux】shell代码,获取当前路径,创建文件夹
  2. ajax用https请求不了_Chrome滚动事件概率性Block Ajax请求
  3. java 文件引用路径_JAVA项目引用文件路径问题
  4. HTML从入门到进阶修炼
  5. 5.QT5中的connect的实现
  6. 生成,保存和转换pcd点云文件
  7. docker安装clickhouse_docker 安装ClickHouse
  8. centos 7.6安装java_Docker安装zabbix5.0LTS教程和优化
  9. 一些随笔,我有故事,你有酒吗
  10. 『原创』用C++开发WM应用系列(6)——深化ListBox控件