Activity
从 ContextImpl
-> startActivity
-> scheduleLaunchActivity(AMS)
到最后 ActivityThread.performLaunchActivity -> Activity.attach中创建出PhoneWindow。
Activity并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是Window。一个Activity包含了一个Window,Window才是真正代表一个窗口。
Activity就像一个控制器,统筹视图的添加与显示,以及通过其他回调方法,来与Window、以及View进行交互。
Window
ActivityThread.performLaunchActivity -> Activity.attach中初始化了Window。
表示一个窗口的概念,是所有View的直接管理者,任何视图都通过Window呈现(点击事件由Window->DecorView->View; Activity的setContentView底层通过Window完成)
Window是一个抽象类,具体实现是PhoneWindow。PhoneWindow中有个内部类DecorView,通过创建DecorView来加载Activity中设置的布局
创建Window需要通过WindowManager创建,通过WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及其他交互
Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是通过IPC完成
View
View 的顶级根节点是 DecorView
,DecorView 是 FrameLayout的子类。
执行Activity的setContentView方法,内部是调用PhoneWindow的setContentView方法,在PhoneWindow中完成DecorView的创建。流程
1、Activity中的setContentView
2、PhoneWindow中的setContentView
3、PhoneWindow中的installDecor
Window 的 实例对象 WindowManager 添加 DecorView,并将 DecorView 交给 ViewRootImpl,ViewRootImpl 是 WindowManager 和 DecorView 的纽带,在起 performTraversals()方法中绘制 View。
总结
Activity 在 performLaunchActivity-> attach 时创建Window(PhoneWindow),在 setContentView 时创建DecorView。执行到 ActivityThread.handleResumeActivity 的 makeVisible
是将 DecorView 添加到 WindowManager中,并创建 ViewRootImpl
,将 DecorView 对象交给 ViewRootImpl,ViewRootImpl通过Handler向主线程发送了一条触发遍历操作的消息:performTraversals()
;该方法用于执行View的绘制流程(measure、layout、draw)
网友评论