这篇文章实际上是对官方文档中WindowManager.LayoutParams的type属性的翻译
实际上我只是生硬的翻译了一下,并不知道所有类型的真正意义
有几个关于window的基础知识需要知道
- 每个Window都对应了一个View和一个ViewRootImpl
- View是Window存在的实体
- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
- Window的具体实现位于WindowManagerService中
- WindowManager是外界访问Window的入口
- WindowManager和WindowManagerService交互是一个IPC过程
- Window的添加过程实际上是一次IPC的调用(为什么会有token的原因)
token
IBinder 类型对象
Identifier for this window. This will usually be filled in for you.
type这个成员变量表示了window的类型(是个int值)
通常有3中window类型
Application windows
取值范围从FIRST_APPLICATION_WINDOW(Constant Value: 1 (0x00000001))到 LAST_APPLICATION_WINDOW(Constant Value: 99 (0x00000063))
这种window是普通的顶层window.
这些种类的window的token必须设置成Activity的token(如果这个token是null,那么需要你来提供)Sub-windows
取值范围从FIRST_SUB_WINDOW(Constant Value: 1000 (0x000003e8))到 LAST_SUB_WINDOW(Constant Value: 1999 (0x000007cf))
这种window一般都和其他顶层window关联在一起,
这种window的token必须是关联的window的token
3.System windows
取值范围为从 FIRST_SYSTEM_WINDOW(Constant Value: 2000 (0x000007d0)) 到 LAST_SYSTEM_WINDOW(Constant Value: 2999 (0x00000bb7))
这种window是特殊的window类型,一般是系统用户特殊目的使用的
这种window不应该被普通程序使用,
想要使用他们必须拥有特别的权限
(也就是说从api23开始不要想通过这种创建这种window的方式构造悬浮窗了,系统默认就不允许)
type有如下类型
//1111111111111111111111111111111111111111111
TYPE_BASE_APPLICATION
//Constant Value: 1 (0x00000001)
一个所有程序的基础window,所有其他程序都显示在其上面
//22222222222222222222222222222222222222222222
TYPE_APPLICATION
//Constant Value: 2 (0x00000002)
一个普通的应用window,它的token必须是Activity的token,用来表示window的归属
//333333333333333333333333333333333333333333333
TYPE_APPLICATION_STARTING
//Constant Value: 3 (0x00000003)
特殊的程序window,用于在程序启动的时候显示,不是给程序使用的
当程序可以显示自己的window之前系统会使用这个window来显示Something
//444444444444444444444444444444444444444444444
TYPE_DRAWN_APPLICATION
//Constant Value: 4 (0x00000004)
一个TYPE_APPLICATION 的变形,
当应用显示之前,用来保证windowmanager会等待这个window绘制完毕
//5555555555555555555555555555555555555555555555
TYPE_APPLICATION_PANEL
//Constant Value: 1000 (0x000003e8)
这种window相当于一个至于程序window顶部的panel,显示在依附的window上面
//6666666666666666666666666666666666666666666666
TYPE_APPLICATION_MEDIA
//Constant Value: 1001 (0x000003e9)
这种window用来显示media(比如视频),显示在依附的window下面
//7777777777777777777777777777777777777777777
TYPE_APPLICATION_SUB_PANEL
//Constant Value: 1002 (0x000003ea)
这是相当于一个子panel,显示在依附的window上面,并且也显示在任何其他TYPE_APPLICATION_PANEL类型的window上面
//8888888888888888888888888888888888888888888888
TYPE_APPLICATION_ABOVE_SUB_PANEL
//constant value: 1005
貌似官方网站网站上没有注解,但我在AS中看到了注释
显示在依附的window上面,且顾名思义显示在所有TYPE_APPLICATION_SUB_PANEL的上面
//999999999999999999999999999999999999999999999999
TYPE_APPLICATION_ATTACHED_DIALOG
//Constant Value: 1003 (0x000003eb)
类似于 TYPE_APPLICATION_PANEL ,不过是作为顶层window,而不是作为一个子window//应该是这个意思
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
TYPE_STATUS_BAR
//Constant Value: 2000 (0x000007d0)
这个window是用来显示状态栏的,只可能有一个状态栏window,它被放置在屏幕的最上方,所有的其他window都在它的下方
//BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
TYPE_SEARCH_BAR
//Constant Value: 2001 (0x000007d1)
searchbar的window,只可能有一个searchbar的window
//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
TYPE_PHONE
//Constant Value: 2002 (0x000007d2)
这不是一个程序的窗口,它用来提供与用户交互的界面(特别是接电话的界面),这个window通常会置于所有程序window之上,但是会在状态栏之下
//DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
TYPE_SYSTEM_ALERT
//Constant Value: 2003 (0x000007d3)
系统window,比如低电量警告之类的,这个window通常在所有应用window之上
//EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
TYPE_TOAST
//Constant Value: 2005 (0x000007d5)
这个window用来显示短暂的通知,比如toast之类的
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
TYPE_SYSTEM_OVERLAY
//Constant Value: 2006 (0x000007d6)
这个window会显示在所有东西之上,系统用来覆盖屏幕用的,这个window最好不要获取焦点,不然会影响keyguard的正常使用
//sixteen
TYPE_PRIORITY_PHONE
//Constant Value: 2007 (0x000007d7)
高优先级的UI,即使keyguard处于激活状态也要显示它,最好不要获取焦点
//seventeen
TYPE_STATUS_BAR_PANEL
//Constant Value: 2014 (0x000007de)
状态栏的下拉界面
//eighteen
TYPE_SYSTEM_DIALOG
//Constant Value: 2008 (0x000007d8)
状态栏的下拉界面显示的dialog
//nineteen
TYPE_KEYGUARD_DIALOG
//Constant Value: 2009 (0x000007d9)
锁屏界面显示的对话框
//twenty
TYPE_SYSTEM_ERROR
//Constant Value: 2010 (0x000007da)
系统内部错误,显示在所有东西上面
//廿壹,廿壹,廿壹,廿壹,廿壹
TYPE_INPUT_METHOD
//Constant Value: 2011 (0x000007db)
内部输入法window,显示在普通的UI之上,
当这个window显示的时候,为了保证这个window获取到焦点,Application的window会被重新测绘
// 廿贰,廿贰,廿贰,廿贰,廿贰,廿贰,廿贰,廿贰
TYPE_INPUT_METHOD_DIALOG
//Constant Value: 2012 (0x000007dc)
输入法的对话框,显示在输入法的window之上
总得来说有个原则,type值越大则显示的越靠上层,
上面的这些type常量都是系统中各种UI默认的使用的值
如果要达到你想要达到的效果甚至可以自己设置想要的int值
比如想要覆盖在状态栏之上,就设置个大于2001且小于2999的值就行
有一点要注意,api>=23之后type要是>=2000则需要一些权限才能使用,至于是什么权限我查了很多网页都没查出来,恐怕是ROOT权限吧
而且api>=23之后,要正确设置token值才能使用,要注意哦