這篇文章實(shí)際上是對(duì)官方文檔中WindowManager.LayoutParams的type屬性的翻譯
實(shí)際上我只是生硬的翻譯了一下,并不知道所有類型的真正意義
有幾個(gè)關(guān)于window的基礎(chǔ)知識(shí)需要知道
- 每個(gè)Window都對(duì)應(yīng)了一個(gè)View和一個(gè)ViewRootImpl
- View是Window存在的實(shí)體
- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
- Window的具體實(shí)現(xiàn)位于WindowManagerService中
- WindowManager是外界訪問Window的入口
- WindowManager和WindowManagerService交互是一個(gè)IPC過程
- Window的添加過程實(shí)際上是一次IPC的調(diào)用(為什么會(huì)有token的原因)
token
IBinder 類型對(duì)象
Identifier for this window. This will usually be filled in for you.
type這個(gè)成員變量表示了window的類型(是個(gè)int值)
通常有3中window類型
Application windows
取值范圍從FIRST_APPLICATION_WINDOW(Constant Value: 1 (0x00000001))到 LAST_APPLICATION_WINDOW(Constant Value: 99 (0x00000063))
這種window是普通的頂層window.
這些種類的window的token必須設(shè)置成Activity的token(如果這個(gè)token是null,那么需要你來提供)Sub-windows
取值范圍從FIRST_SUB_WINDOW(Constant Value: 1000 (0x000003e8))到 LAST_SUB_WINDOW(Constant Value: 1999 (0x000007cf))
這種window一般都和其他頂層window關(guān)聯(lián)在一起,
這種window的token必須是關(guān)聯(lián)的window的token
3.System windows
取值范圍為從 FIRST_SYSTEM_WINDOW(Constant Value: 2000 (0x000007d0)) 到 LAST_SYSTEM_WINDOW(Constant Value: 2999 (0x00000bb7))
這種window是特殊的window類型,一般是系統(tǒng)用戶特殊目的使用的
這種window不應(yīng)該被普通程序使用,
想要使用他們必須擁有特別的權(quán)限
(也就是說從api23開始不要想通過這種創(chuàng)建這種window的方式構(gòu)造懸浮窗了,系統(tǒng)默認(rèn)就不允許)
type有如下類型
//1111111111111111111111111111111111111111111
TYPE_BASE_APPLICATION
//Constant Value: 1 (0x00000001)
一個(gè)所有程序的基礎(chǔ)window,所有其他程序都顯示在其上面
//22222222222222222222222222222222222222222222
TYPE_APPLICATION
//Constant Value: 2 (0x00000002)
一個(gè)普通的應(yīng)用window,它的token必須是Activity的token,用來表示window的歸屬
//333333333333333333333333333333333333333333333
TYPE_APPLICATION_STARTING
//Constant Value: 3 (0x00000003)
特殊的程序window,用于在程序啟動(dòng)的時(shí)候顯示,不是給程序使用的
當(dāng)程序可以顯示自己的window之前系統(tǒng)會(huì)使用這個(gè)window來顯示Something
//444444444444444444444444444444444444444444444
TYPE_DRAWN_APPLICATION
//Constant Value: 4 (0x00000004)
一個(gè)TYPE_APPLICATION 的變形,
當(dāng)應(yīng)用顯示之前,用來保證windowmanager會(huì)等待這個(gè)window繪制完畢
//5555555555555555555555555555555555555555555555
TYPE_APPLICATION_PANEL
//Constant Value: 1000 (0x000003e8)
這種window相當(dāng)于一個(gè)至于程序window頂部的panel,顯示在依附的window上面
//6666666666666666666666666666666666666666666666
TYPE_APPLICATION_MEDIA
//Constant Value: 1001 (0x000003e9)
這種window用來顯示media(比如視頻),顯示在依附的window下面
//7777777777777777777777777777777777777777777
TYPE_APPLICATION_SUB_PANEL
//Constant Value: 1002 (0x000003ea)
這是相當(dāng)于一個(gè)子panel,顯示在依附的window上面,并且也顯示在任何其他TYPE_APPLICATION_PANEL類型的window上面
//8888888888888888888888888888888888888888888888
TYPE_APPLICATION_ABOVE_SUB_PANEL
//constant value: 1005
貌似官方網(wǎng)站網(wǎng)站上沒有注解,但我在AS中看到了注釋
顯示在依附的window上面,且顧名思義顯示在所有TYPE_APPLICATION_SUB_PANEL的上面
//999999999999999999999999999999999999999999999999
TYPE_APPLICATION_ATTACHED_DIALOG
//Constant Value: 1003 (0x000003eb)
類似于 TYPE_APPLICATION_PANEL ,不過是作為頂層window,而不是作為一個(gè)子window//應(yīng)該是這個(gè)意思
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
TYPE_STATUS_BAR
//Constant Value: 2000 (0x000007d0)
這個(gè)window是用來顯示狀態(tài)欄的,只可能有一個(gè)狀態(tài)欄window,它被放置在屏幕的最上方,所有的其他window都在它的下方
//BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
TYPE_SEARCH_BAR
//Constant Value: 2001 (0x000007d1)
searchbar的window,只可能有一個(gè)searchbar的window
//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
TYPE_PHONE
//Constant Value: 2002 (0x000007d2)
這不是一個(gè)程序的窗口,它用來提供與用戶交互的界面(特別是接電話的界面),這個(gè)window通常會(huì)置于所有程序window之上,但是會(huì)在狀態(tài)欄之下
//DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
TYPE_SYSTEM_ALERT
//Constant Value: 2003 (0x000007d3)
系統(tǒng)window,比如低電量警告之類的,這個(gè)window通常在所有應(yīng)用window之上
//EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
TYPE_TOAST
//Constant Value: 2005 (0x000007d5)
這個(gè)window用來顯示短暫的通知,比如toast之類的
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
TYPE_SYSTEM_OVERLAY
//Constant Value: 2006 (0x000007d6)
這個(gè)window會(huì)顯示在所有東西之上,系統(tǒng)用來覆蓋屏幕用的,這個(gè)window最好不要獲取焦點(diǎn),不然會(huì)影響keyguard的正常使用
//sixteen
TYPE_PRIORITY_PHONE
//Constant Value: 2007 (0x000007d7)
高優(yōu)先級(jí)的UI,即使keyguard處于激活狀態(tài)也要顯示它,最好不要獲取焦點(diǎn)
//seventeen
TYPE_STATUS_BAR_PANEL
//Constant Value: 2014 (0x000007de)
狀態(tài)欄的下拉界面
//eighteen
TYPE_SYSTEM_DIALOG
//Constant Value: 2008 (0x000007d8)
狀態(tài)欄的下拉界面顯示的dialog
//nineteen
TYPE_KEYGUARD_DIALOG
//Constant Value: 2009 (0x000007d9)
鎖屏界面顯示的對(duì)話框
//twenty
TYPE_SYSTEM_ERROR
//Constant Value: 2010 (0x000007da)
系統(tǒng)內(nèi)部錯(cuò)誤,顯示在所有東西上面
//廿壹,廿壹,廿壹,廿壹,廿壹
TYPE_INPUT_METHOD
//Constant Value: 2011 (0x000007db)
內(nèi)部輸入法window,顯示在普通的UI之上,
當(dāng)這個(gè)window顯示的時(shí)候,為了保證這個(gè)window獲取到焦點(diǎn),Application的window會(huì)被重新測(cè)繪
// 廿貳,廿貳,廿貳,廿貳,廿貳,廿貳,廿貳,廿貳
TYPE_INPUT_METHOD_DIALOG
//Constant Value: 2012 (0x000007dc)
輸入法的對(duì)話框,顯示在輸入法的window之上
總得來說有個(gè)原則,type值越大則顯示的越靠上層,
上面的這些type常量都是系統(tǒng)中各種UI默認(rèn)的使用的值
如果要達(dá)到你想要達(dá)到的效果甚至可以自己設(shè)置想要的int值
比如想要覆蓋在狀態(tài)欄之上,就設(shè)置個(gè)大于2001且小于2999的值就行
有一點(diǎn)要注意,api>=23之后type要是>=2000則需要一些權(quán)限才能使用,至于是什么權(quán)限我查了很多網(wǎng)頁(yè)都沒查出來,恐怕是ROOT權(quán)限吧
而且api>=23之后,要正確設(shè)置token值才能使用,要注意哦