美文网首页面试题
Activity,window,DecorView,viewRo

Activity,window,DecorView,viewRo

作者: wenju_song | 来源:发表于2018-10-21 14:02 被阅读39次

    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,viewRo

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