Window、Activity、DecorView

2020-09-15  本文已影响0人  小李同学今天博学了吗

Activity:控制声明周期和处理事件,统筹视图的添加与显示

Window:是视图承载器,内部持有一个DecorView,WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及交互

DecorView:为Android视图树的根节点视图,DecorView中包含一个LinearLayout
,他是一个垂直的布局,由三部分组成,第一个为ViewStub,第二个为标题栏,第三个为内容栏

ViewRoot:这个类的作用就是链接WindowManagerService和DecorView,View的三大流程:Measure、Layout、Draw都是通过它来完成的


截屏2020-08-21 下午8.48.45.png
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像个连接器,负责沟通,通过硬件的感知来通知视图,进行用户之间的 交互。

上一篇下一篇

猜你喜欢

热点阅读