zoukankan      html  css  js  c++  java
  • 安卓高手之路之 WindowManager

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

        

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

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

    layer的函数:

    Java代码  收藏代码
    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走之后,再显示锁屏。

  • 相关阅读:
    asp.net文件操作类
    MSMQ是什么?
    Type.GetType()在跨程序集反射时返回null的解决方法
    ASP.NET反射
    VS单元测试入门实践教程
    详解Linq to SQL
    .Net资源文件全球化
    正则表达式使用详解
    C# 中的委托和事件详解
    python基础
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3866072.html
Copyright © 2011-2022 走看看