window是一個(gè)抽象類,它的具體實(shí)現(xiàn)時(shí)PhoneWindow喂很,創(chuàng)建window是由windowManager來(lái)完成的
android的所有視圖都是通過(guò)window來(lái)呈現(xiàn)的,activity、toast宁玫、Dialog都是附加在window上的驮樊,window是view的直接管理者
window的3中類型:應(yīng)用window薇正、子window和系統(tǒng)window
- 應(yīng)用window:對(duì)應(yīng)著一個(gè)Activity
- 子window:不能單獨(dú)存在片酝,要附加在父window上
- 系統(tǒng)window:需要聲明權(quán)限在能創(chuàng)建的window
window是分層的,層級(jí)大的會(huì)覆蓋在層級(jí)小的上面
windowManager提供了添加View挖腰、更新View雕沿、刪除View方法,這三個(gè)方法定義在ViewManager中猴仑,而WindowManager繼承了ViewManager
windowManger可以創(chuàng)建一個(gè)window并向其中添加View审轮,更新window中的View,刪除一個(gè)Window就是刪除window中的view就行了
window中的內(nèi)部機(jī)制
每個(gè)Window對(duì)應(yīng)著一個(gè)View和一個(gè)ViewRootImpl辽俗,window和view是通過(guò)viewRootImpl類建立聯(lián)系的断国,window并不是實(shí)際存在的,它是以View的形式存在的榆苞,在實(shí)際應(yīng)用中無(wú)法直接訪問(wèn)window稳衬,要通過(guò)windowManager來(lái)訪問(wèn)
window添加過(guò)程
通過(guò)windowManager的addView來(lái)實(shí)現(xiàn),實(shí)際操作時(shí)由WindowManagerGlobal來(lái)實(shí)現(xiàn)的坐漏,最終window的添加請(qǐng)求是交給WindowManagerSevice去處理的
Window刪除過(guò)程
和添加過(guò)程一樣薄疚,先通過(guò)WindowManagerImpl后,在進(jìn)一步通過(guò)WindowManagerGlobal來(lái)實(shí)現(xiàn)的赊琳,內(nèi)部具體的刪除操作是由ViewRootImpl的die方法來(lái)完成的街夭,刪除view分同步刪除和異步刪除,異步刪除會(huì)發(fā)出一個(gè)MSG_DIE的消息躏筏,ViewRootImpl的Handler會(huì)處理此消息并調(diào)用doDie方法板丽,同步刪除直接調(diào)用doDie方法,doDie方法內(nèi)部會(huì)調(diào)用dispatchDetachedFromWindow方法趁尼,真正刪除View的邏輯在這個(gè)方法中
dispatchDetachedFromWindow方法主要做:
- 垃圾回收
- 通過(guò)session的remove方法刪除window埃碱,最終會(huì)調(diào)用WindowManagerService的removeWindow方法
- 調(diào)用view的onDetachedFromWindow方法,view從window中移除會(huì)調(diào)用此方法
- 調(diào)用WindowManagerGlobal的doRemoveView方法更新數(shù)據(jù)
window的創(chuàng)建(activity)
activity的啟動(dòng)最終是由activityThread中的performLaunchActivity方法來(lái)完成的酥泞,這個(gè)方法內(nèi)部會(huì)通過(guò)類加載器創(chuàng)建activity的實(shí)例對(duì)象砚殿,并調(diào)用其attach方法關(guān)聯(lián)運(yùn)行過(guò)程中的上下文環(huán)境
**在attach方法內(nèi),系統(tǒng)會(huì)創(chuàng)建activity所屬的window對(duì)象并為其設(shè)置回調(diào)接口
- 如果沒(méi)有ViewDecor就創(chuàng)建一個(gè)
- 將View添加到ViewDecor的content中
- 回調(diào)activity的onContentChanged方法
- 將ViewDecor添加到window中