--摘自《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相關的一切資源
歡迎關注我的微信公眾號:安卓圈

