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

    安卓高手之路之 WindowManager - 修补C++ - ITeye技术网站

    安卓中的画面不是纯粹由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.  }  
       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走之后,再显示锁屏。

  • 相关阅读:
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    便携版WinSCP在命令行下同步文件夹
    ffmpeg (ffprobe)分析文件关键帧时间点
    sqlite删除数据或者表后,回收数据库文件大小
    ubuntu 20.04下 freeswitch 配合 fail2ban 防恶意访问
    ffmpeg使用nvenc编码的结论记录
    PC版跑跑卡丁车 故事模式 亚瑟传说章节 卡美洛庆典 2阶段 心灵之眼 攻略
    There was an error loading or playing the video
    Nvidia RTX Voice 启动报错修复方法
    火狐浏览器 关闭跨域限制
  • 原文地址:https://www.cnblogs.com/seven1979/p/4369621.html
Copyright © 2011-2022 走看看