安卓中的画面不是纯粹由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走之后,再显示锁屏。
相关推荐
android13 WindowManager-Shell.jar
主要为大家详细介绍了Android利用WindowManager实现悬浮窗效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一个WindowManager悬浮窗,悬浮显示歌词效果。WindowManager背景设置为了透明色,显示的WindowManager关闭启动它的Activity回到主界面仍然有效。仅供参考............
android 采用windowmanager屏蔽home键
利用windowmanager的addview()方法制作的弹出式窗口,可以手指跟随,点击根据状态可以展开或者伸缩。
WindowManager属性详解:WindowManager.LayoutParams 是 WindowManager 接口的嵌套类;继承于 ViewGroup.LayoutParams 。 它的内容十分丰富。其实WindowManager.java的主要内容就是由这个类定义构成。
核心在于WindowManager,通过它创建一个LayoutParams对象,然后利用该对象设置flag、gravity、xy坐标点。它提供三个方法:addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。主要...
仿360悬浮窗,WindowManager的使用
window、windowmanager的分析
Android悬浮窗实现 使用WindowManager实现像电视顶端文字广告栏效果,开发工具:AS
这个是一个悬浮框权限的判断代码,基本涵盖市面上主流手机的判断,可以直接下载使用,测试过,非常的好用
Window是一个抽象类,具体实现是 PhoneWindow 。不管是 Activity 、 Dialog 、 Toast 它们的视图都是附加在Window上的,因此Window实际上是View的直接管理者。
WindowManager添加隐藏窗口后,按CTRL+1,可实现隐藏,在按CTRL+1,取消隐藏,适合打开桌面窗口较多的人的,超级老板键!!!
主要为大家详细介绍了Android自定义Toast之WindowManager的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
windowmanager对话框,添加6.0权限判断,
你会发现QQ视频的时候,就算手机回到主页,视频小模块依旧能悬浮在桌面上。还有当年很火的各种手机杀毒软件的桌面小助手,总能在呆在桌面。这种悬浮窗的操作就需要用到Window。
在App里的Demo2实现,使用WindowManager在Service实现
可移动的悬浮按钮,用WindowManager,自动义FloatView实现,代码简单移动,只需一步,直接接入项目中。。
软件简介:WindowManager 3.1 绿色版[桌面窗口管理器 ] 是一个桌面窗口管理器,可以方便地管理系统桌面上的所有打开的窗口;可以隐藏、透明化或者置顶窗口,还可以制定相应的规则来控制窗口的打开。它还提供了最小...
调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,...