1, 概述
Android窗口类型主要分成了三大类:
1,应用程序窗口。一般应用程序的窗口,比如我们应用程序的Activity的窗口。
2,子窗口。一般在Activity里面的窗口,比如各种菜单等。
3,系统窗口。系统的窗口,比如输入法,Toast,墙纸等。
WindowManager里面窗口的type类型值定义是一个递增保留的连续增大数值。其实就是窗口的Z-ORDER序列(值越大显示的位置越在上面,需要将屏幕想成三维坐标模式)。
2 WindowManager/LayoutParams
2.1 窗口类型
WindowManager(窗口管理)是如何管理Window呢?
WindowManager是一个接口,首先看看里面的关键定义,
窗口类型,
public int type;
应用程序窗口
FIRST_APPLICATION_WINDOW = 1 |
第一个应用窗口 |
TYPE_APPLICATION = 2 |
应用的默认窗口 |
LAST_APPLICATION_WINDOW = 99 |
最后的应用窗口 |
所有acitivty的窗口的值都在[1,99],默认值是TYPE_APPLICATION,WMS在进行窗口叠加时,会动态的改变activity的值。
子窗口
子窗口的Z序和坐标空间都依赖于Activity窗口
所有子窗口的值都在[1000,1999], WMS在进行窗口叠加时,会动态调整子窗口的值。
系统窗口
FIRST_SYSTEM_WINDOW = 2000 |
第一个系统窗口 |
TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW |
状态条 |
TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1 |
搜索条 |
TYPE_PHONE= FIRST_SYSTEM_WINDOW+2 |
来电显示窗口 |
TYPE_SYSTEM_ALERT= FIRST_SYSTEM_WINDOW+3 |
警告对话框 |
TYPE_KEYGUARD= FIRST_SYSTEM_WINDOW+4 |
屏保 |
TYPE_TOAST= FIRST_SYSTEM_WINDOW+5 |
Toast |
TYPE_SYSTEM_OVERLAY= FIRST_SYSTEM_WINDOW+6 |
|
TYPE_PRIORITY_PHONE= FIRST_SYSTEM_WINDOW+7 |
屏幕保护下的来电显示窗口 |
TYPE_SYSTEM_DIALOG= FIRST_SYSTEM_WINDOW+8 |
|
TYPE_KEYGUARD_DIALOG= FIRST_SYSTEM_WINDOW+9 |
屏幕保护下的对话框窗口 |
TYPE_SYSTEM_ERROR= FIRST_SYSTEM_WINDOW+10 |
系统错误窗口 |
TYPE_INPUT_METHOD= FIRST_SYSTEM_WINDOW+11 |
输入法窗口 |
系统窗口远不止上面的表格中所展现的,一共定义了33种。
系统窗口的创建一般不依赖于Activity窗口
所有系统窗口的值都在[2000,2999], WMS在进行窗口叠加时,会动态调整子窗口的值。有些系统窗口只能出现一个,不能添加多个,否则用户会觉得很乱(体验差)。比如输入法窗口,系统状态条窗口等。
2.2 窗口内存缓存类型
public int memoryType; // 保存窗口内存缓存类型
窗口内存缓存一共有4种,
public static final int MEMORY_TYPE_NORMAL = 0; //窗口缓冲位于主内存
public static final int MEMORY_TYPE_HARDWARE=1;//窗口缓冲位于可以被DMA访问,或者硬件加速的内存区域
public static final int MEMORY_TYPE_GPU = 2; //窗口缓冲位于可被图形加速器访问的区域
public static final int MEMORY_TYPE_PUSH_BUFFERS = 3; //窗口缓冲不拥有自己的缓冲区,不能被锁定,缓冲区由本地方法提供
2.3 窗口行为类型
public int flags; //保存窗口的行为
窗口行为类型的行为一共32种,数值都是2的n次幂,所以各种flags可以混合使用,直接按位或是最好的方法。
比如最开始四种行为定义如下,
//Flag:当该window对用户可见的时候,允许锁屏 public static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 0x00000001; //Flag:让该window后所有的东西都成暗淡 public static final int FLAG_DIM_BEHIND = 0x00000002; //Flag:让该window后所有东西都模糊(4.0以上已经放弃这种毛玻璃效果) public static final int FLAG_BLUR_BEHIND = 0x00000004; //Flag:让window不能获得焦点,这样用户快就不能向该window发送按键事 public static final int FLAG_NOT_FOCUSABLE = 0x00000008;
2.4 硬件加速类型