Window 和windowManager原始碼分析
阿新 • • 發佈:2019-01-23
所有需要顯示在螢幕上的內容都要通過windowManager
windowManager 是一個介面 三個方法 add remove update
他的具體實現類是windowManagerImpl類(橋接模式)
具體的實現是交給了windowManagerGlobal處理
WindowManagerGlobal Addview的過程
(每個window 都有對應的 VIEW VR )
- 檢查引數是否合法
- 建立ViewRootImpl 並將 view新增到列表中 在其中有幾個列表
ArrayList mviews window 對應view ArrayList
mRoots window 對應的 VR ArrayList mDyingview
被刪除的view物件 ArrayList<> mParams window 對應的引數佈局 - 通過viewRootImpl 的SetView方法完成 SetView通過requestLayout 完成非同步請求 接著通過windowSession 完成最終的window新增過程 mWindowSession
是IwindowSession一個Binder物件 實現類是session (IPC呼叫)
Session內部通過WMS來實現window 的新增 wms會為每一個應用保留一個session 由此進入到framework層
Activity 中window 的建立過程
1. Activty 所屬的window 物件是同過PolicyManager的makenewWindow方法實現的
2. 策略類 真正的實現類是policy 而policy中makeNewWindow方法返回的是phoneWindow
由此可見window的具體實現是phoneWindow
至此Activity 的window已經建立完成
那麼Activity 的檢視是如何附屬在window 上的呢?
1.看setContentView 方法
2.轉移至Phonewindow 的setContentView 方法上
1.建立DecorView 頂級佈局
2.將view 新增至mContentParent 上
3.回撥Activity的onContentChanged 方法通知檢視已經改變。