Window表示一個(gè)窗口的概念,Window是一個(gè)抽象類,它的具體實(shí)現(xiàn)是PhoneWindow。創(chuàng)建一個(gè)Window,需要通過(guò)WindowManager即可完成,WindowManager是外界訪問(wèn)Window的入口,Window具體實(shí)現(xiàn)位于WindowManagerService中,WindowManager和WindowManagerService的交互是一個(gè)IPC的過(guò)程。Android中,所有的視圖都是通過(guò)Window來(lái)呈現(xiàn),不管是Activity、Dialog、還是Toast,它們的視圖實(shí)際上都是附加在Window上,因此Window是實(shí)際View的直接管理者,單擊事件由Window傳遞給DecorView,然后再由DecorView傳遞給我們的View,就連Activity的設(shè)置視圖方法setContentView在底層也是通過(guò)Window來(lái)完成的。
Window和WindowManager
添加一個(gè)Window的過(guò)程,重點(diǎn)代碼是:
mWindowManager.addView(mFLoatingButton,mLayoutParams);
WindowManager.LayoutParams中有兩個(gè)flags和type參數(shù)。
Flags參數(shù)有三個(gè)Window屬性
FLAG_NOT_FOCUSABLE。表示W(wǎng)indow不需要獲取焦點(diǎn),也不需要接收各種輸入事件,最終事件會(huì)直接傳遞給下層的具有焦點(diǎn)的Window
FLAG_NOT_TOUCH_MODAL。在此模式下,系統(tǒng)會(huì)將當(dāng)前Window區(qū)域以外的單擊事件傳遞給底層的Window,當(dāng)前Window區(qū)域以內(nèi)的單擊事件則自己處理,這個(gè)標(biāo)記很重要,一般來(lái)說(shuō)都需要開(kāi)啟此標(biāo)記,否則其他Window將無(wú)法收到單擊事件
FLAG_SHOW_WHEN_LOCKED。開(kāi)啟此模式可以讓W(xué)indow顯示在鎖屏的界面上。
Type參數(shù)表示W(wǎng)indow的類型,有三種類型,分別是應(yīng)用Window,子Window和系統(tǒng)Window,應(yīng)用類Window對(duì)應(yīng)一個(gè)Activity,子Window不能單獨(dú)存在,它需要附屬在特定的父Window之中,比如常見(jiàn)的Dialog就是一個(gè)子Window,系統(tǒng)Window是需要聲