新增一個window示例(程式碼示例參考任玉剛的安卓藝術探索)
WindowManager是外界訪問window的入口,window的具體實現位於WindowManagerService中,windowManager和WinowManagerService的互動是一個IPC過程.
window是一個抽象的概念,每個window都對應一個View和ViewRootImpl,window和View通過ViewRootImpl來建立聯絡的。從原始碼看WindowManager是繼承ViewManager,所以window的具體表現形式是view。
window的新增過程
從原始碼看,WindowManager是一個介面,真正實現window的新增,更新,刪除由WindowManagerImpl類,WindowManagerImpl委託WindowManagerGlobal具體實現
分析原始碼:
WindowManagerGlobal addView內部核心程式碼
在addView方法裡,會建立ViewRootImpl物件,由ViewRootImpl的物件處理重新佈局和完成window的新增,scheduleTraversals()是view繪製入口。
ViewRootImpl類setView方法核心程式碼:
在系統接收任何事情之前執行重新佈局。
由IWindowSession完成Window的新增,IWindowSession是一個AIDL介面,通過Session實現,Session最終交由WindowManagerService實現,WindowManagerService,Session都是Binder,由此可見Window的新增是一個IPC互動的過程。
window的刪除
由原始碼看,Window的刪除也是WindowManagerGlobal類實現。
removeViewLocked方法裡面會建立ViewRootImpl,由viewRootImpl的最終由doDie方法去刪除, die的結果返回表示為true的時候將待刪除的viewm放到DyingViews稍後刪除。
View的刪除邏輯dispatchDetachedFromWindow方法裡面,刪除window以後,呼叫WindowManagerGlobal的doRemoveView方法清空mRoots,mParams,mDyingViews。
dispatchDetachedFromWindow方法裡面首先呼叫mView.dispatchDetachedFromWindow()的方法,當view從window分離後呼叫onDetachedFromWindow,表示view不在被繪畫,可以在這個方法內部做一些資源的回收工作,重寫時候必須要呼叫super方法。
由IWindowSession完成Window的刪除,IWindowSession是一個AIDL介面,通過Session實現,Session最終交由WindowManagerService實現
Window的重新整理過程
由原始碼看,Window的重新整理也是WindowManagerGlobal類實現。
就是更新WindowManager.LayoutParams。