Activity:控制声明周期和处理事件,统筹视图的添加与显示
Window:是视图承载器,内部持有一个DecorView,WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及交互
DecorView:为Android视图树的根节点视图,DecorView中包含一个LinearLayout
,他是一个垂直的布局,由三部分组成,第一个为ViewStub,第二个为标题栏,第三个为内容栏
ViewRoot:这个类的作用就是链接WindowManagerService和DecorView,View的三大流程:Measure、Layout、Draw都是通过它来完成的
DecorView的创建
简单的来说就是创建一个Decorview,之后通过LayoutInflater.inflate加载出要我们xml中的布局,之后通过decorview.add(view)将布局加载进来,
DecorView的显示
通过调用makeVisible方法,其中wm.addView在其内部创建了一个ViewRootImpl对象,负责绘制各个子View
void makeVisible() {
if (!mWindowAdded) {
ViewManager wm = getWindowManager();
wm.addView(mDecor, getWindow().getAttributes());//将Deco rView添加到
WindowManager
mWindowAdded = true;
}
mDecor.setVisibility(View.VISIBLE);//DecorView可见 }
addView方法
public void addView(View view, ViewGroup.LayoutParams params, Display display, Window parentWindow) {
final WindowManager.LayoutParams wparams = (WindowManager.La youtParams) params;
......
synchronized (mLock) {
ViewRootImpl root;
//实例化一个ViewRootImpl对象
root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
}
......
try {
//将DecorView交给ViewRootImpl root.setView(view, wparams, panelParentView);
} catch (RuntimeException e) {
}
}
总结
通过以上了解可以知道,Activity就像个控制器,不负责视图部分。Window像个 承载器,装着内部视图。DecorView就是个顶层视图,是所有View的最外层布局。 ViewRoot像个连接器,负责沟通,通过硬件的感知来通知视图,进行用户之间的 交互。