Window表示一個窗口的概念,Window是一個抽象類,它的具體實現(xiàn)是PhoneWindow。創(chuàng)建一個Window,需要通過WindowManager即可完成,WindowManager是外界訪問Window的入口,Window具體實現(xiàn)位于WindowManagerService中,WindowManager和WindowManagerService的交互是一個IPC的過程。Android中,所有的視圖都是通過Window來呈現(xiàn),不管是Activity、Dialog、還是Toast,它們的視圖實際上都是附加在Window上,因此Window是實際View的直接管理者,單擊事件由Window傳遞給DecorView,然后再由DecorView傳遞給我們的View,就連Activity的設(shè)置視圖方法setContentView在底層也是通過Window來完成的。

Window和WindowManager

添加一個Window的過程,重點代碼是:

mWindowManager.addView(mFLoatingButton,mLayoutParams);

WindowManager.LayoutParams中有兩個flags和type參數(shù)。

Flags參數(shù)有三個Window屬性

  • FLAG_NOT_FOCUSABLE。表示W(wǎng)indow不需要獲取焦點,也不需要接收各種輸入事件,最終事件會直接傳遞給下層的具有焦點的Window

  • FLAG_NOT_TOUCH_MODAL。在此模式下,系統(tǒng)會將當(dāng)前Window區(qū)域以外的單擊事件傳遞給底層的Window,當(dāng)前Window區(qū)域以內(nèi)的單擊事件則自己處理,這個標(biāo)記很重要,一般來說都需要開啟此標(biāo)記,否則其他Window將無法收到單擊事件

  • FLAG_SHOW_WHEN_LOCKED。開啟此模式可以讓W(xué)indow顯示在鎖屏的界面上。

Type參數(shù)表示W(wǎng)indow的類型,有三種類型,分別是應(yīng)用Window,子Window和系統(tǒng)Window,應(yīng)用類Window對應(yīng)一個Activity,子Window不能單獨存在,它需要附屬在特定的父Window之中,比如常見的Dialog就是一個子Window,系統(tǒng)Window是需要聲