理解WindowManagerService


--摘自《Android進階解密》

*WMS的職責*

1)窗口管理  WMS負責窗口的啟動、添加和刪除,另外窗口的大小和層級也是由WMS進行管理的

2)窗口動畫  WMS的動畫子系統WindowAnimator負責窗口間的切換動畫

3)輸入系統的中轉站  InputManagerService會對觸摸事件進行處理,尋找最合適的窗口來處理觸摸反饋信息

4)Surface管理  WMS為每個窗口分配Surface來供自己繪制

*WMS的創建工程*

WMS是在SystemServer進程中創建的

上面三個線程實現三個步驟

1)首先在system_server線程中執行了SystemServer的startOtherServices方法,在startOtherServices方法中會調用WMS的main方法,main方法會創建WMS,創建的過程咋iandroid.display線程中實現,創建WMS的優先級更高,因此system_server線程要等WMS創建完成后,處於等待狀態的system_server線程才會被喚醒從而繼續執行下面的代碼

2)在WMS的構造方法中會調用WMS的initPolicy方法,在initPolicy方法中又會調用PWM的init方法,PWM的init方法在android.ui線程中運行,它的優先級要高於android.display線程,因此“android.display”線程要等PWM的init方法執行完畢后,處於等待狀態的android.display線程才會被喚醒從而繼續執行下面的代碼

3)PWM的init方法執行完畢后,android.display線程就完成了WMS的創建,等待的system_server線程被喚醒后繼續執行WMS的main方法后的代碼邏輯,比如WMS的displayReady方法用來初始化屏幕顯示信息

知識點:

1)Watchdog用來監控系統的一些關鍵服務的運行狀況

*WMS的重要成員*

1.mPolicy:WindowManagerPolicy  是窗口管理策略的接口類,用來定義一個窗口策略所要遵循的通用規范,並提供了WindowManager所有的特定的UI行為

2.mSessions:ArraySet  主要用於進程間通信,其他的應用程序進程想要和WMS進程進行通信就需要經過Session,並且每個應用程序進程都會對應一個Session

3.mWindowMap:WindowHashMap  用來保存WMS中各種窗口的集合

4.mFinishedStarting:ArrayList  用於存儲已經完成啟動的應用程序窗口(比如Activity)的AppWindowToken的列表

5.mResizingWindows:ArrayList  用來存儲正在調整大小的窗口的列表

6.mAnimator:WindowAnimator  用於管理窗口的動畫以及特效動畫

7.mH:H  用來將任務加入到主線程的消息隊列中

8.mInputManager:InputManagerService  輸入系統的管理者

*Window的添加過程(WMS處理部分)*

WindowToken可以理解為窗口令牌,且會將一個組件(比如同一個Activity)的窗口(WindowState)集合在一起,方便管理

主要是以下4件事

1)對所要添加的窗口進行檢查,如果窗口不滿足一些條件,就不會再執行下面的代碼邏輯

2)WindowToken相關的處理,比如有的窗口類型需要提供WindowToken,沒有提供的話就不會執行下面的代碼邏輯,有的窗口類型則需要由WMS隱式創建WindowToken

3)WindowState的創建和相關處理,將WindowToken和WindowState相關聯

4)創建和配置DisplayContent,完成窗口添加到系統前的准備工作

*Window的刪除過程*

要刪除Window需要先調用WindowManagerImpl的removeView方法,在removeView方法中又會調用WindowManagerGlobal的removeView方法

主要是以下4件事

1)檢查刪除線程的正確性,如果不正確就拋出異常(因為只有創建Window的原始線程才能夠操作Window)

2)從ViewRootImpl列表、布局參數列表和View列表中刪除與Window對應的元素

3)判斷是否可以直接執行刪除操作,如果不能就推遲刪除操作(比如Window正在運行一個動畫)

4)執行刪除操作,清理和釋放與Window相關的一切資源

歡迎關注我的微信公眾號:安卓圈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM