理解Window的新增,刪除,重新整理內部機制

utf發表於2018-01-19

新增一個window示例(程式碼示例參考任玉剛的安卓藝術探索)

理解Window的新增,刪除,重新整理內部機制

理解Window的新增,刪除,重新整理內部機制

WindowManager是外界訪問window的入口,window的具體實現位於WindowManagerService中,windowManager和WinowManagerService的互動是一個IPC過程.

window是一個抽象的概念,每個window都對應一個View和ViewRootImpl,window和View通過ViewRootImpl來建立聯絡的。從原始碼看WindowManager是繼承ViewManager,所以window的具體表現形式是view。

理解Window的新增,刪除,重新整理內部機制

window的新增過程

從原始碼看,WindowManager是一個介面,真正實現window的新增,更新,刪除由WindowManagerImpl類,WindowManagerImpl委託WindowManagerGlobal具體實現

理解Window的新增,刪除,重新整理內部機制

分析原始碼:

WindowManagerGlobal addView內部核心程式碼

理解Window的新增,刪除,重新整理內部機制

在addView方法裡,會建立ViewRootImpl物件,由ViewRootImpl的物件處理重新佈局和完成window的新增,scheduleTraversals()是view繪製入口。

理解Window的新增,刪除,重新整理內部機制

ViewRootImpl類setView方法核心程式碼:

在系統接收任何事情之前執行重新佈局。

理解Window的新增,刪除,重新整理內部機制

理解Window的新增,刪除,重新整理內部機制

理解Window的新增,刪除,重新整理內部機制

由IWindowSession完成Window的新增,IWindowSession是一個AIDL介面,通過Session實現,Session最終交由WindowManagerService實現,WindowManagerService,Session都是Binder,由此可見Window的新增是一個IPC互動的過程。

理解Window的新增,刪除,重新整理內部機制

理解Window的新增,刪除,重新整理內部機制

window的刪除

由原始碼看,Window的刪除也是WindowManagerGlobal類實現。

理解Window的新增,刪除,重新整理內部機制

removeViewLocked方法裡面會建立ViewRootImpl,由viewRootImpl的最終由doDie方法去刪除, die的結果返回表示為true的時候將待刪除的viewm放到DyingViews稍後刪除。

理解Window的新增,刪除,重新整理內部機制

理解Window的新增,刪除,重新整理內部機制

理解Window的新增,刪除,重新整理內部機制

View的刪除邏輯dispatchDetachedFromWindow方法裡面,刪除window以後,呼叫WindowManagerGlobal的doRemoveView方法清空mRoots,mParams,mDyingViews。

理解Window的新增,刪除,重新整理內部機制

dispatchDetachedFromWindow方法裡面首先呼叫mView.dispatchDetachedFromWindow()的方法,當view從window分離後呼叫onDetachedFromWindow,表示view不在被繪畫,可以在這個方法內部做一些資源的回收工作,重寫時候必須要呼叫super方法。

理解Window的新增,刪除,重新整理內部機制

由IWindowSession完成Window的刪除,IWindowSession是一個AIDL介面,通過Session實現,Session最終交由WindowManagerService實現

理解Window的新增,刪除,重新整理內部機制

Window的重新整理過程

由原始碼看,Window的重新整理也是WindowManagerGlobal類實現。

就是更新WindowManager.LayoutParams。

理解Window的新增,刪除,重新整理內部機制

相關文章