ChangeNOW Token中文网
领取MOLI红包

详解Android布局加载流程源码

发布日期:2025-01-04 17:48    点击次数:124
一.首先看布局层次 看这么几张图 我们会发现DecorView里面包裹的内容可能会随着不同的情况而变化,但是在Decor之前的层次关系都是固定的。即Activity包裹PhoneWindow,PhoneWindow包裹DecorView。接下来我们首先看一下三者分别是如何创建的。 二.Activity是如何创建的 首先看到入口类ActivityThread的performLaunchActivity方法: 有句特别关键的代码,即 所以activity是Instrumentation类的newActivity方法创建的,追踪过去,源码如下 追踪源码,可知getFactory方法返回一个AppComponentFactory对象,然后调用AppComponentFactory的instantiateActivity方法,继续追踪 到这里就结束了,我们可以发现Activity是通过反射创建的。 三.PhoneWindow的创建 我们还是回到ActivityThread的performLaunchActivity方法,在刚刚展示的那一段的下面有如下部分代码 在activity.attach这个方法中,传入了一个Window对象,追踪这个attach方法,里面有一句关键代码 此时就创建了PhoneWindow。所以我们可以知道,在Activity创建完之后,会为当前的Activity创建一个PhoneWindow对象。 四.DecorView的创建 DecorView的创建就不是performLaunchActivity方法里面了,这次我们从Activity的setContentView的源码开始分析。下面的Activity的setContentView方法的内容。 我们发现,Activity的setContentView实际是调用了PhoneWindow的setContentView方法,跟踪源码。我们会首先进入Window抽象类,然后我们找其子类PhoneWindow,在里面找到setContentView方法 当mContentParent为null时,会调用installDecor方法,追踪进入 它调用了generateDecor方法,追踪进入 会发现generateDecor方法会创建一个DecorView对象,并且作为返回值返回。再追踪DecorView 会发现DecorView其实是一个FrameLayout 。到这就介绍完DecorView是如何创建的了 五.布局加载流程 我们回到PhoneWindow的installDecor方法,再刚刚看的部分的下面,有(2692行) 追踪进入 分析源码和源码注释可以看出generateLayout方法的核心功能是完成DecorView的布局加载,而且根据不同的主题样式会加载不同的系统默认布局。那么比如有FrameLayout布局,它如何加载到DecorView中呢? 在generateLayout方法中,有这么一句 追踪进入 关键在这里 可以看到layoutResource作为参数,通过inflate方法进行解析加载。然后作为参数,传入addView方法,将布局挂载到上面。至此完成了DecorView的默认布局加载。如果是我们自己编写的布局是如何加载呢?再回到generateLayout的 ,在此之后,有这么一句 在DecorView执行onResourcesLoaded方法加载完默认布局后,会查找Id为ID_ANDROID_CONTENT的控件(默认布局中的FrameLayout控件)并作为generateLayout方法的返回值,我们回到setContentView方法中,可观察到以下代码: 所以,我们自己编写的布局是被加载到DecorView中Id为ID_ANDROID_CONTENT的控件上 六.总结 当Activity创建后会创建出一个PhoneWindow对象,当在Activity中调用setContentView时,实际上是调用了PhoneWindow的setContentView方法,此时PhoneWindow会创建根布局DecorView,并根据主题样式,为DecorView加载对应的默认系统布局,在默认的系统布局中包含了一个Id为ID_ANDROID_CONTENT的控件,而我们自己编写的布局就是加载到这个控件中的。 以上就是详解Android布局加载流程源码的详细内容,更多关于Android布局加载流程源码分析的资料请关注脚本之家其它相关文章!



Powered by ChangeNOW Token中文网 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群系统 © 2013-2024