第8章 理解Window和WindowManager

Window是一個抽象的類,它的具體實現(xiàn)是PhoneWindow
Window有三種類型 應(yīng)用window ,子window 系統(tǒng)window window是分層的,每個window對應(yīng)著z-ordered
WindowManager所提供的功能很簡單,添加view,更新view,和刪除view

8.2Window的內(nèi)部機制
Window是一個抽象的概念,每一個window都對應(yīng)一個View和一個ViewRoootImpl。View才是Window存在的實體

8.2.1Window的添加過程

Windowmanager是一個接口,它的真正實現(xiàn)是WindowManagerImpl。WindowmanagerImpl將操作交給了windowManagerGlobal來處理。
WindowmanagerGlobal的addView方法主要分為以下幾步

1.檢查view是否存在,如果是子View還需要調(diào)整一些布局。
2.創(chuàng)建VIewmpl并將view添加到列表 mView存儲所有的window所對應(yīng)的view,mRoo存儲的是所有Window所對應(yīng)的ViewRootImpl,mParam存儲的是所有Window所對應(yīng)的布局參數(shù)。mDyingViews則存儲正在被刪除的view
3通過ViewRootImpl類似更新界面并完成Window的添加過程
這個步驟是通過viewRootImpl的setView方法來完成的,requestLayout,scheduleTraversals().接著通過windowSession來最終完成Window的添加過程mWindowSession.addToDpisplay().最后WindowManagerService來實現(xiàn)Window的添加。

8.3Window的創(chuàng)建過程
Activity啟動后 ActivityThread中的performLaunchActivity() 來完成整個啟動過程。并調(diào)用attach方法為其關(guān)聯(lián)運行過程中所依賴的一系列上下文環(huán)境變量
在 Activity的attach方法里,window的創(chuàng)建是通過PolicyManager的makenewWindow創(chuàng)建的,activity實現(xiàn)了window的callback接口。policymanager的真正實現(xiàn)類是policy makeNewWindow 方法中 使用了phoneWindow來創(chuàng)建window。、window創(chuàng)建完畢后,需要附著到activity上。這里看activity的setContentView方法其中調(diào)用了getWindow().setContentView(layoutid)

setConentView方法步驟如下
1.如果沒有decorView就創(chuàng)建它
2.將View添加到DecorView的mContentParent中
3.回調(diào)activity的onContentChange方法通知Activity視圖已經(jīng)發(fā)生改變
4.在ActivityThread的handleResumeActivity方法中,首先調(diào)用了Activity的onresume方法,接著會調(diào)用Activity的makeVisible()在makeVieible方法中,DecorView真正的完成了添加和顯示這兩個過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容