Android源码探索:DecorView与ViewRootImpl解析

0 下载量 42 浏览量 更新于2024-09-01 收藏 109KB PDF 举报
"这篇文章除了探讨Android开发中的核心组件Activity和View的关系,还深入讲解了当在Activity中调用setContentView方法时,如何启动视图层次的构建过程。文章主要关注点在于DecorView和ViewRootImpl在Android视图系统中的作用。作者通过源码分析,带领读者理解Activity创建后到View开始工作之前的关键步骤,为后续学习View的测量、布局和绘制流程打下基础。文中提及的源码基于Android API 21。" 在Android开发中,Activity是应用程序的基本构建块,而View则是用户界面的核心元素。当我们使用`setContentView`方法加载布局时,实际上是在初始化Activity的视图层次结构。在`setContentView`内部,方法调用`getWindow().setContentView(layoutResID)`,这里的`getWindow()`返回一个Window对象,它是Activity与窗口管理器之间的接口。 Window是一个抽象类,其`setContentView`方法需要在具体实现类中定义。在Activity中,`mWindow`通常是在`attach`方法中被初始化,赋予一个实现了Window接口的实例。这个实现类通常是PhoneWindow,它进一步将`setContentView`的调用转发到内部的`ViewRootImpl`。 `ViewRootImpl`是Android视图系统的关键组件,它作为Activity和Android系统服务之间的桥梁,负责将View树连接到窗口系统。在`setContentView`的过程中,`ViewRootImpl`创建并管理一个名为`DecorView`的特殊View。`DecorView`是所有Activity的顶级View,它默认包含了Android的标题栏和其他装饰元素,同时也作为传递触摸事件和布局更新的入口点。 `DecorView`的创建是通过`PhoneWindow`的`installDecor`方法完成的,然后`ViewRootImpl`会将传入的布局资源(如R.layout.main)添加到`DecorView`中,完成Activity视图的构造。这个过程涉及到了View的测量、布局和绘制三个关键步骤,但在这个阶段,它们还未真正开始执行。 在`ViewRootImpl`中,`setView`方法会将`DecorView`和传入的布局View绑定,并开始初始化视图的测量和布局流程。这个过程中,`ViewRootImpl`会发送一个“测量”消息到UI线程的消息队列,随后在适当的时机执行测量和布局操作,最后调用`draw`方法来绘制整个视图层次结构。 从Activity的`setContentView`开始,通过`Window`、`ViewRootImpl`以及`DecorView`,我们能够理解Android如何构建并显示用户界面。这对于深入理解Android系统的运行机制,尤其是自定义View或者优化性能时,是非常重要的基础知识。