[置顶] 安卓高手之路之 WindowManager

xiaoxiao2021-02-28  38

安卓中的画面不是纯粹由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 查看图片附件
转载请注明原文地址: https://www.6miu.com/read-79495.html

最新回复(0)