`
daojin
  • 浏览: 691564 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

安卓高手之路之 WindowManager

 
阅读更多

安卓中的画面不是纯粹由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
分享到:
评论

相关推荐

    android13 WindowManager-Shell.jar

    android13 WindowManager-Shell.jar

    Android利用WindowManager实现悬浮窗

    Android悬浮窗实现原理和WindowManager详解 Android悬浮窗是指在Android系统中,可以悬浮在屏幕上的一种窗口,常见于QQ视频、手机杀毒软件的桌面小助手等应用中。要实现悬浮窗,需要使用WindowManager来管理窗口。...

    android 采用windowmanager屏蔽home键

    本文将详细介绍如何在Android应用中采用`WindowManager`来屏蔽Home键。 首先,我们需要创建一个悬浮窗口(Floating Window),这是`WindowManager`的主要用途之一。悬浮窗口可以覆盖在其他应用之上,我们可以通过...

    android surfaceview 悬浮窗圆角 windowmanager

    总的来说,创建一个带有圆角的`SurfaceView`悬浮窗涉及到对Android视图层次结构的理解、`SurfaceView`的特性利用、`WindowManager`的运用以及自定义`View`的绘制技巧。这个过程需要开发者具备扎实的Android基础知识...

    Android悬浮框权限判断WindowManager

    `WindowManager`是Android SDK中的一个关键组件,它负责管理Android设备上的窗口。开发者可以利用`WindowManager`来添加、更新或删除窗口,包括创建悬浮框。以下是对`WindowManager`及悬浮框权限的详细说明: 1. **...

    Android 利用WindowManager实现悬浮窗 demo

    `WindowManager`是Android系统服务之一,它允许应用管理窗口并控制它们在屏幕上的位置和显示方式。本篇将深入探讨如何利用`WindowManager`来创建一个悬浮窗(Floating Window)的demo。 首先,悬浮窗的本质是在应用...

    android利用windowmanager的伸缩式窗口

    在Android开发中,WindowManager是一个非常重要的服务,它允许开发者将视图添加到系统的顶级窗口层次结构中,实现各种自定义的界面效果。本篇主要探讨如何利用WindowManager的`addView()`方法来创建一个可伸缩的弹出...

    Android悬浮窗实现 使用WindowManager Demo

    在Android应用开发中,有时我们需要实现一种特殊的功能,即悬浮窗(Floating Window),它可以在其他应用之上显示,常用于提供快捷操作或者实时信息提示。本教程将深入讲解如何使用`WindowManager`服务来创建和管理...

    windowmanager

    在Android系统中,WindowManager是负责管理窗口的重要组件,它允许开发者将视图添加到屏幕上的窗口层次结构中。理解Window和WindowManager的工作原理对于深入Android应用开发至关重要。本文将详细探讨这两个概念及其...

    Android WindowManager悬浮显示歌词

    一个WindowManager悬浮窗,悬浮显示歌词效果。WindowManager背景设置为了透明色,显示的WindowManager关闭启动它的Activity回到主界面仍然有效。仅供参考............

    WindowManager属性详解

    WindowManager属性详解:WindowManager.LayoutParams 是 WindowManager 接口的嵌套类;继承于 ViewGroup.LayoutParams 。 它的内容十分丰富。其实WindowManager.java的主要内容就是由这个类定义构成。

    WindowManager弹窗

    在WindowManager中,常见的LayoutParams类型有`WindowManager.LayoutParams.TYPE_SYSTEM_ALERT`或`TYPE_PHONE`,这些类型使得弹窗可以在其他应用之上显示,但又不会完全阻塞用户与系统交互。 5. **添加视图**:使用...

    Android自定义Toast之WindowManager

    Android 自定义 Toast 之 WindowManager Android 自定义 Toast 之 WindowManager 是 Android 开发中的一种常见技术,用于在应用程序中显示自定义的 Toast 消息。本文将详细介绍 Android 自定义 Toast 之 ...

    windowmanager对话框

    WindowManager是Android系统的系统服务之一,它提供了添加、删除和更新窗口的能力。在创建自定义对话框时,通常会使用LayoutInflater来加载XML布局,然后通过WindowManager的LayoutParams对象来设置对话框的位置和...

    WindowManager

    WindowManager是一款专为多桌面窗口管理设计的工具,尤其适合那些在工作中需要频繁切换和隐藏窗口的用户。它提供了一种高效且便捷的方式来管理和保护你的桌面环境,确保你在需要时可以快速地隐藏或显示窗口,避免因...

    android利用windowmanager实现悬浮窗

    核心在于WindowManager,通过它创建一个LayoutParams对象,然后利用该对象设置flag、gravity、xy坐标点。它提供三个方法:addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。主要...

    仿360悬浮窗,WindowManager的使用

    首先,我们要了解`WindowManager`是Android系统中的一个接口,它用于管理系统的窗口。通过`WindowManager`,我们可以添加、删除或更新窗口,实现自定义视图的显示。在实际应用中,悬浮窗通常会用到`TYPE_PHONE`或者`...

    WindowManager.addView()实现悬浮窗口播放视频

    在Android开发中,有时我们需要创建一个浮动在其他应用之上的窗口来实现特定功能,比如悬浮播放视频。`WindowManager.addView()`方法就是实现这一目标的关键。本文将深入探讨如何利用`WindowManager`服务和布局参数...

    Android 可移动悬浮窗口 WindowManager

    这种技术主要通过Android的`WindowManager`服务实现。下面将详细探讨`WindowManager`及其在创建悬浮窗口中的应用。 首先,`WindowManager`是Android系统提供的一个接口,用于管理窗口的添加、删除和排列。它允许...

    简单模仿360悬浮球 手动拖动悬浮窗效果DEMO WindowManager Demo

    在Android开发中,实现类似360悬浮球的效果是一项常见的需求,这主要涉及到对`WindowManager`类的使用,以及自定义View的交互处理。在这个DEMO中,开发者创建了一个可手动拖动的悬浮窗,其中视图是一个`TextView`,...

Global site tag (gtag.js) - Google Analytics