Android 中 activity、window、view 三者关系

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)

参考

DecorView创建
ViewRoot Window简介

你可能感兴趣的:(Android 中 activity、window、view 三者关系)