Android 中 activity、window、view 三者關(guān)系

Activity

ContextImpl -> startActivity-> scheduleLaunchActivity(AMS) 到最后 ActivityThread.performLaunchActivity -> Activity.attach中創(chuàng)建出PhoneWindow。

Activity并不負(fù)責(zé)視圖控制,它只是控制生命周期和處理事件。真正控制視圖的是Window。一個(gè)Activity包含了一個(gè)Window,Window才是真正代表一個(gè)窗口。

Activity就像一個(gè)控制器,統(tǒng)籌視圖的添加與顯示,以及通過(guò)其他回調(diào)方法,來(lái)與Window、以及View進(jìn)行交互。

Window

ActivityThread.performLaunchActivity -> Activity.attach中初始化了Window。

表示一個(gè)窗口的概念,是所有View的直接管理者,任何視圖都通過(guò)Window呈現(xiàn)(點(diǎn)擊事件由Window->DecorView->View; Activity的setContentView底層通過(guò)Window完成)

Window是一個(gè)抽象類,具體實(shí)現(xiàn)是PhoneWindow。PhoneWindow中有個(gè)內(nèi)部類DecorView,通過(guò)創(chuàng)建DecorView來(lái)加載Activity中設(shè)置的布局

創(chuàng)建Window需要通過(guò)WindowManager創(chuàng)建,通過(guò)WindowManager將DecorView加載其中,并將DecorView交給ViewRoot,進(jìn)行視圖繪制以及其他交互

Window具體實(shí)現(xiàn)位于WindowManagerService中,WindowManager和WindowManagerService的交互是通過(guò)IPC完成

View

View 的頂級(jí)根節(jié)點(diǎn)是 DecorView,DecorView 是 FrameLayout的子類。

執(zhí)行Activity的setContentView方法,內(nèi)部是調(diào)用PhoneWindow的setContentView方法,在PhoneWindow中完成DecorView的創(chuàng)建。流程

1、Activity中的setContentView
2、PhoneWindow中的setContentView
3、PhoneWindow中的installDecor

Window 的 實(shí)例對(duì)象 WindowManager 添加 DecorView,并將 DecorView 交給 ViewRootImpl,ViewRootImpl 是 WindowManager 和 DecorView 的紐帶,在起 performTraversals()方法中繪制 View。

總結(jié)

Activity 在 performLaunchActivity-> attach 時(shí)創(chuàng)建Window(PhoneWindow),在 setContentView 時(shí)創(chuàng)建DecorView。執(zhí)行到 ActivityThread.handleResumeActivity 的 makeVisible是將 DecorView 添加到 WindowManager中,并創(chuàng)建 ViewRootImpl,將 DecorView 對(duì)象交給 ViewRootImpl,ViewRootImpl通過(guò)Handler向主線程發(fā)送了一條觸發(fā)遍歷操作的消息:performTraversals();該方法用于執(zhí)行View的繪制流程(measure、layout、draw)

參考

DecorView創(chuàng)建
ViewRoot Window簡(jiǎn)介

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容