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真正的完成了添加和顯示這兩個過程