安卓高手之路之 WindowManager_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 安卓高手之路之 WindowManager

安卓高手之路之 WindowManager

 2014/9/29 10:00:00  xiaochao1234  程序员俱乐部  我要评论(0)
  • 摘要:安卓中的画面不是纯粹由window组成。而是改成了window+view的组织模式。window是一个顶层窗口的概念。view就相当于在window内的控件。而subwindow则是依附于window的一些对话框。安卓在对window进行管理的时候,将window分为很多层,不同的层又对应于不同的window类型。下面这个图阐释了这种概念:安卓首先将窗口按照layer分层,然后每一层又有很多window,每一个window又包含了很多的view和sublayer
  • 标签:高手

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

    

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

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

layer的函数:

 

 

Java代码 javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash">APPLICATION_WINDOW%20%26%26%20type%20%3C%3D%20LAST_APPLICATION_WINDOW)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20APPLICATION_LAYER%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20switch%20(type)%20%7B%0A%20%20%20%20%20%20%20%20case%20TYPE_STATUS_BAR%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20STATUS_BAR_LAYER%3B%2F%2F14%0A%20%20%20%20%20%20%20%20case%20TYPE_STATUS_BAR_PANEL%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20STATUS_BAR_PANEL_LAYER%3B%2F%2F15%0A%20%20%20%20%20%20%20%20case%20TYPE_STATUS_BAR_SUB_PANEL%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20STATUS_BAR_SUB_PANEL_LAYER%3B%2F%2F13%0A%20%20%20%20%20%20%20%20case%20TYPE_SYSTEM_DIALOG%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20SYSTEM_DIALOG_LAYER%3B%2F%2F5%0A%20%20%20%20%20%20%20%20case%20TYPE_SEARCH_BAR%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20SEARCH_BAR_LAYER%3B%2F%2F4%20%20%20%2F%2F4%0A%20%20%20%20%20%20%20%20case%20TYPE_PHONE%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20PHONE_LAYER%3B%2F%2F3%20%20%2F%2F3%0A%20%20%20%20%20%20%20%20case%20TYPE_KEYGUARD%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20KEYGUARD_LAYER%3B%2F%2F11%0A%20%20%20%20%20%20%20%20case%20TYPE_KEYGUARD_DIALOG%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20KEYGUARD_DIALOG_LAYER%3B%2F%2F12%0A%20%20%20%20%20%20%20%20case%20TYPE_SYSTEM_ALERT%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20SYSTEM_ALERT_LAYER%3B%2F%2F8%0A%20%20%20%20%20%20%20%20case%20TYPE_SYSTEM_ERROR%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20SYSTEM_ERROR_LAYER%3B%2F%2F19%0A%20%20%20%20%20%20%20%20case%20TYPE_INPUT_METHOD%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20INPUT_METHOD_LAYER%3B%2F%2F9%20%0A%20%20%20%20%20%20%20%20case%20TYPE_INPUT_METHOD_DIALOG%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20INPUT_METHOD_DIALOG_LAYER%3B%2F%2F10%0A%20%20%20%20%20%20%20%20case%20TYPE_VOLUME_OVERLAY%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20VOLUME_OVERLAY_LAYER%3B%2F%2F16%0A%20%20%20%20%20%20%20%20case%20TYPE_SYSTEM_OVERLAY%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20SYSTEM_OVERLAY_LAYER%3B%2F%2F17%0A%20%20%20%20%20%20%20%20case%20TYPE_SECURE_SYSTEM_OVERLAY%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20SECURE_SYSTEM_OVERLAY_LAYER%3B%2F%2F21%0A%20%20%20%20%20%20%20%20case%20TYPE_PRIORITY_PHONE%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20PRIORITY_PHONE_LAYER%3B%2F%2F7%0A%20%20%20%20%20%20%20%20case%20TYPE_TOAST%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20TOAST_LAYER%3B%2F%2F6%0A%20%20%20%20%20%20%20%20case%20TYPE_WALLPAPER%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20WALLPAPER_LAYER%3B%2F%2F%202%0A%20%20%20%20%20%20%20%20case%20TYPE_DRAG%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20DRAG_LAYER%3B%2F%2F20%0A%20%20%20%20%20%20%20%20case%20TYPE_POINTER%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20POINTER_LAYER%3B%20%2F%2F23%0A%20%20%20%20%20%20%20%20case%20TYPE_NAVIGATION_BAR%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20NAVIGATION_BAR_LAYER%3B%2F%2F18%0A%20%20%20%20%20%20%20%20case%20TYPE_BOOT_PROGRESS%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20BOOT_PROGRESS_LAYER%3B%20%2F%2F22%0A%20%20%20%20%20%20%20%20case%20TYPE_HIDDEN_NAV_CONSUMER%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20HIDDEN_NAV_CONSUMER_LAYER%3B%20%2F%2F24%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20Log.e(TAG%2C%20%22Unknown%20window%20type%3A%20%22%20%2B%20type)%3B%0A%20%20%20%20%20%20%20%20return%20APPLICATION_LAYER%3B%0A%20%20%20%20%7D" />ways" /> class="star" src="/Upload/Images/2014092909/40B102E0EF997EA6.png" alt="收藏代码" />
  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走之后,再显示锁屏。

发表评论
用户名: 匿名