Activity,window,DecorView,viewRoot之间的关系

Activity和window,DecorView ,viewRoot是什么关系,这一篇文章将揭晓。

一,职能简介

  • Activity
    • 控制生命周期和处理事件。
    • 统筹视图的添加与显示,通过回调与Window和View进行交互。
  • Window
    • 子类PhoneWindow,用于控制视图
    • PhoneWindow中有个内部类DecorView。通过创建DecorView来加载R.layout.activity_main。
    • Window通过WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及其他交互。
  • DecorView
    • DecorView的父类是FrameLayout,是Android View树的根节。
    • 内部包含一个竖直方向的LinearLayout,它有上下三个部分,上面是个ViewStub,延迟加载的视图(ActionBar,根据Theme设置),中间的是标题栏(根据Theme设置,有的布局没有),下面的是内容栏。 setContentView所设置的布局文件其实就是被加到内容栏之中的。
    • ViewGroup content = (ViewGroup)findViewById(android.R.id.content);
    • ViewGroup rootView = (ViewGroup) content.getChildAt(0);
  • ViewRoot
    • 控制View的事件处理和逻辑处理。

    • ViewRoot子类是ViewRootImpl类,它是连接WindowManagerService和DecorView的纽带,View的三大流程(测量(measure),布局(layout),绘制(draw))均通过ViewRoot来完成。

    • ViewRoot并不属于View树的一部分。从源码实现上来看,它既非View的子类,也非View Group,但它实现了ViewParent接口,这让它可以作为View的名义上的父视图。

    • RootView继承了Handler类,可以接收事件并分发。

    • Android的所有触屏事件、按键事件、界面刷新等事件都是通过ViewRoot进行分发的。

    • 三者之间的关系

二,DecorView的创建

这部分内容主要讲DecorView是怎么一层层嵌套在Actvity,PhoneWindow中的,以及DecorView如何加载内部布局。

  • setContentView
    • 先是从Activity中的setContentView()开始
      • getWindow().setContentView(layoutResID);
      • 实际是交给Window装载视图
  • Activity是怎么获得Window对象的?在Activity中的attach()方法中,生成了PhoneWindow实例。
  • 设置DecorView给Window对象。

三, DecorView的显示

  • 通过setContentView()设置的界面,为什么在onResume()之后才对用户可见呢?

    * ActivityThread 的handleResumeActivity()方法调用Activity.makeVisible()方法。
    image
  • 以上的ViewManager调用addView创建ViewRootImpl,然后调用performTraversals()方法,然后完成绘制。
    image

以上就是对Activity,window,DecorView,viewRoot的介绍,以及DecorView的创建和显示。

你可能感兴趣的:(Activity,window,DecorView,viewRoot之间的关系)