android開發window和windowmanager

Window是一個抽象類,具體實現是PhoneWindow。創建一個Window只需要通過WindowManager即可WindowManager是外界訪問Window的入口,Window的具體實現位於WindowManagerService中,WindowManager和WindowManagerService的交互是一個IPC過程。Android中的所有試圖都是通過Window呈現的。無論是Activity、Dialog、Toast,他們的視圖實際上都是附加在Window上的,因此Window實際是View直接管理者。

Flags參數表示Window的屬性,通過這些選項可以控制Window的顯示特性。

Window有三種類型,分別是應用Window、子Window和系統Window,應用類Window對應着一個Activity。子Window不能單獨存在,它需要附屬在特定的父Window之上,比如常見的一些Dialog就是一個字Window。系統Window是需要特定聲明權限才能夠創建的Window,比如Toast和系統狀態欄這些都是系統Window。

Window會有層的概念,層級大的會覆蓋在層級小得Window上面。在三類Window中,應用層Window的層級範圍是1-99,字Window的層級範圍是1000-1999,系統Window的層級範圍是2000-2999,因此係統Window會覆蓋子Window,應用層Window優先級最低,層級範圍對應WindowManager.LayoutParams的type參數。

系統級Window所需要的權限爲SYSTEM_ALERT_WINDOW

Window繼承與ViewManager,其中有三個重要的方法:addView,updateViewLayout,removeView

Window是一個抽象的概念,每一個Window都對應着一個View和ViewRootImpl,Window和View是通過ViewRootImp聯繫起來的,因此Window並不是真實存在的他是以View的形式存在的,這一點從WindowManager的定義也可以看出,他提供的三個接口方法addView、updateViewLayout和removeView都是直接針對View的,這說明View纔是Window存在的實體。

Window的添加過程需要通過WindowManager的addView實現,WindowManager是一個接口,他的真正實現是WindowManagerImpl。而在WindowManagerImpl內部並沒有真正實現Window的三大操作,而是全部交給了WindowManagerGlobal,WindowManagerGlobal以工廠的形式向外提供自己的實例。WindowManager這種工作模式是典型的橋接模式,將所有操鎖全部委託給WindowManagerGlobal來來實現。

View的最終繪製過程是由ViewRootImpl的setView內部調用requestLayout來完成的。

View是Android中的視圖呈現方式,但是View不能單獨存在,他必須依附在Window上,因此有視圖的地方就有Window。因此Android中的Activity、Dialog、Toast等視圖都對應着一個Window。

Activity的啓動最終是會由ActivityThread中的performLaunchActivity來完成整個啓動過程,在這個方法內部會通過類加載器去創建Activity的實例,並調用attach方法爲其關聯運行過程中所依賴的上下文環境變量。

Toast基於Window實現,但是由於Toast具有定時取消這一功能,所以系統採用了Handler。Toast屬於系統Window。

Taost的顯示和隱藏實際上是通過Toast中的TN這個類來實現的,他有兩個方法show和hide,分別對應Toast的顯示和隱藏,由於這兩個方法是被NMS以跨進程的方式調運的,因此他們運行在Binder線程池中。爲了將執行環境切換到Toast所在的線程,在他們的內部使用了Handler.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章