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中的setContentView()开始
- Activity是怎么获得Window对象的?在Activity中的attach()方法中,生成了PhoneWindow实例。
-
设置DecorView给Window对象。
三, DecorView的显示
-
通过setContentView()设置的界面,为什么在onResume()之后才对用户可见呢?
* ActivityThread 的handleResumeActivity()方法调用Activity.makeVisible()方法。
-
以上的ViewManager调用addView创建ViewRootImpl,然后调用performTraversals()方法,然后完成绘制。
以上就是对Activity,window,DecorView,viewRoot的介绍,以及DecorView的创建和显示。