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)