前面介绍了ViewRootImpl
与Choreographer
的相互配合刷新界面:界面是如何刷新的流程
ViewRootImpl
的描述是这样的:
The top of a view hierarchy, implementing the needed protocol between View and the WindowManager. This is for the most part an internal implementation detail of WindowManagerGlobal
翻译一下
View层次结构的顶部,实现视图和窗口管理器之间所需的协议。这在很大程度上是一种WindowManagerGlobal详细的内部实现
View mView
作为ViewRootImpl
的一个属性,承担了所有和视图相关的操作。
我们可以猜测 mView
就是用户看到的屏幕界面。
为了验证猜测,下面我们看一下mView
是从哪里来的,是怎么添加到ViewRootImpl
中的。
绑定视图到Window
从最熟悉的地方开始:
#Activity
public void setContentView(View view, ViewGroup.LayoutParams params) {
getWindow().setContentView(view, params);
}
Window
的实现类是PhoneWindow
,Decor是Activity View视图最外层的ViewGroup,由PhoneWindow
创建:
#PhoneWindow
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
installDecor();
mContentParent.addView(view, params);
}
Window和WindowManager的创建
在Activity
的attach
创建了PhoneWindow
的实例:
#Activity
final void attach() {
mWindow = new PhoneWindow(this, window, activityConfigCallback);
mWindow