1. 程式人生 > >Window 和windowManager原始碼分析

Window 和windowManager原始碼分析

所有需要顯示在螢幕上的內容都要通過windowManager

windowManager 是一個介面 三個方法 add remove update

他的具體實現類是windowManagerImpl類(橋接模式)
具體的實現是交給了windowManagerGlobal處理

WindowManagerGlobal Addview的過程
(每個window 都有對應的 VIEW VR )

  1. 檢查引數是否合法
  2. 建立ViewRootImpl 並將 view新增到列表中 在其中有幾個列表
    ArrayList mviews window 對應view ArrayList
    mRoots window 對應的 VR ArrayList mDyingview
    被刪除的view物件 ArrayList<> mParams window 對應的引數佈局
  3. 通過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 方法通知檢視已經改變。