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


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

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

layer的函数:

  1. public int windowTypeToLayerLw(int type) {
  2. if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) {
  3. return APPLICATION_LAYER;
  4. }
  5. switch (type) {
  6. case TYPE_STATUS_BAR:
  7. return STATUS_BAR_LAYER;//14
  8. case TYPE_STATUS_BAR_PANEL:
  9. return STATUS_BAR_PANEL_LAYER;//15
  10. case TYPE_STATUS_BAR_SUB_PANEL:
  11. return STATUS_BAR_SUB_PANEL_LAYER;//13
  12. case TYPE_SYSTEM_DIALOG:
  13. return SYSTEM_DIALOG_LAYER;//5
  14. case TYPE_SEARCH_BAR:
  15. return SEARCH_BAR_LAYER;//4   //4
  16. case TYPE_PHONE:
  17. return PHONE_LAYER;//3  //3
  18. case TYPE_KEYGUARD:
  19. return KEYGUARD_LAYER;//11
  20. case TYPE_KEYGUARD_DIALOG:
  21. return KEYGUARD_DIALOG_LAYER;//12
  22. case TYPE_SYSTEM_ALERT:
  23. return SYSTEM_ALERT_LAYER;//8
  24. case TYPE_SYSTEM_ERROR:
  25. return SYSTEM_ERROR_LAYER;//19
  26. case TYPE_INPUT_METHOD:
  27. return INPUT_METHOD_LAYER;//9
  28. case TYPE_INPUT_METHOD_DIALOG:
  29. return INPUT_METHOD_DIALOG_LAYER;//10
  30. case TYPE_VOLUME_OVERLAY:
  31. return VOLUME_OVERLAY_LAYER;//16
  32. case TYPE_SYSTEM_OVERLAY:
  33. return SYSTEM_OVERLAY_LAYER;//17
  34. case TYPE_SECURE_SYSTEM_OVERLAY:
  35. return SECURE_SYSTEM_OVERLAY_LAYER;//21
  36. case TYPE_PRIORITY_PHONE:
  37. return PRIORITY_PHONE_LAYER;//7
  38. case TYPE_TOAST:
  39. return TOAST_LAYER;//6
  40. case TYPE_WALLPAPER:
  41. return WALLPAPER_LAYER;// 2
  42. case TYPE_DRAG:
  43. return DRAG_LAYER;//20
  44. case TYPE_POINTER:
  45. return POINTER_LAYER; //23
  46. case TYPE_NAVIGATION_BAR:
  47. return NAVIGATION_BAR_LAYER;//18
  48. case TYPE_BOOT_PROGRESS:
  49. return BOOT_PROGRESS_LAYER; //22
  50. case TYPE_HIDDEN_NAV_CONSUMER:
  51. return HIDDEN_NAV_CONSUMER_LAYER; //24
  52. }
  53. Log.e(TAG, "Unknown window type: " + type);
  54. return APPLICATION_LAYER;
  55. }

很多人看到这个后不知道怎么分析,一下子被从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走之后,再显示锁屏。

安卓高手之路之 WindowManager的更多相关文章

  1. 安卓高手之路之 ClassLoader

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

  2. ClassLoader使用记录《安卓高手之路》

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

  3. 安卓高手之路之ClassLoader(二)

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

  4. 安卓高手之路之PackageManagerservice

    源码位置:frameworks/base/core/java/android/content/pm/PackageParser.java 源文件路径:android\frameworks\base\s ...

  5. 安卓高手之路之java层Binder

    很多人一提到Binder就说代理模式,人云亦云的多,能理解精髓的少. 本篇文章就从设计角度分析一下java层BInder的设计目标,以及设计思路,设计缺陷,从而驾驭它. 对于[邦德儿]的理解, 从通信 ...

  6. 安卓高手之路之ClassLoader(三)

    由于看C++和C代码看得很累,很辛苦.上一章终于解脱到java代码中来了. 第一个getClassLoader发生在main的preload方法中, public static void main(S ...

  7. 王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第十一讲Hadoop图文训练课程:MapReduce的原理机制和流程图剖析

    这一讲我们主要剖析MapReduce的原理机制和流程. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发 ...

  8. 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程

    这一讲主要深入使用HDFS命令行工具操作Hadoop分布式集群,主要是通过实验的配置hdfs-site.xml文件的心跳来测试replication具体的工作和流程. 通过HDFS的心跳来测试repl ...

  9. 云计算分布式大数据Hadoop实战高手之路第八讲Hadoop图文训练课程:Hadoop文件系统的操作实战

    本讲通过实验的方式讲解Hadoop文件系统的操作. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发布云 ...

随机推荐

  1. 记录一次cefsharp1输入法在win7下异常解决定位

    最近几天都被基于cefSharp封装的浏览器控件搞疯了!对于cefSharp基本满足当前所做项目的需求,但是有一个问题一直困扰我,那就是系统中偶尔会出现输入法不能转换到中文.而且这个问题似乎没有什么规 ...

  2. iframe根据子页面自动调整大小

    //iframe高度自适应 function IFrameReSize(iframename) { var pTar = document.getElementById(iframename); if ...

  3. 僵尸进程&孤儿进程

    http://www.cnblogs.com/Anker/p/3271773.html

  4. 转自 处理老版PIL 到 pillow

    帮新同事部署开发环境, 由于项目代码里用到了PIL库处理图片, 导致一些图片在浏览器中无法正常显示.  几番折腾, 解决了问题, 这里记录一下报的问题, 及解决方法: 1. python版本不对, 6 ...

  5. Linux下的grep搜索命令详解(一)

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  6. HDU 5867 Water problem (模拟)

    Water problem 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5867 Description If the numbers ...

  7. rdlc 分页操作

    工具箱中拖一个列表过来,设置 列表-->行组-->组属性常规-->组表达式=Int((RowNumber(Nothing)-1)/10)分页符-->勾选在组的结尾

  8. sql的union用法

    sql中union是很常见的,尤其是创建视图时,完全离不开union. SQL UNION 操作符合并两个或多个 SELECT 语句的结果,UNION 内部的每个 SELECT 语句必须拥有相同数量的 ...

  9. Spring Boot 所提供的配置优先级顺序

    按照优先级从高到低的顺序,具体的列表如下所示. 命令行参数. 通过 System.getProperties() 获取的 Java 系统参数. 操作系统环境变量. 从 java:comp/env 得到 ...

  10. 51Nod 1201 整数划分 (经典dp)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题意不多说了. dp[i][j]表示i这个数划分成j个数 ...