美文网首页
Window、Activity、DecorView

Window、Activity、DecorView

作者: 小李同学今天博学了吗 | 来源:发表于2020-09-15 16:35 被阅读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像个连接器,负责沟通,通过硬件的感知来通知视图,进行用户之间的 交互。

    相关文章

      网友评论

          本文标题:Window、Activity、DecorView

          本文链接:https://www.haomeiwen.com/subject/aeuujktx.html