美文网首页Android开发经验谈Android技术知识程序员
AndroidUI绘制流程,一步一步深入源码解析(一)

AndroidUI绘制流程,一步一步深入源码解析(一)

作者: MR_特殊人士 | 来源:发表于2019-04-01 17:43 被阅读16次

1、UI结构,从Activity的setContentView()入手;了解xml布局的嵌套关系

第一步、根据代码,源码中找到Actitivyt中setContentView()方法的实现,这里我用的是http://androidxref.com/在线源码阅读平台,选择8.0源码

在/frameworks/base/core/java/android/app/Activity.java

/**

    * Set the activity content from a layout resource.  The resource will be

    * inflated, adding all top-level views to the activity.

    *

    * @param layoutResID Resource ID to be inflated.

    *

    * @see #setContentView(android.view.View)

    * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)

    */

    public void setContentView(@LayoutRes int layoutResID) {

        getWindow().setContentView(layoutResID);

        initWindowDecorActionBar();

    }

 我们从activity中setCotentview()调用了getWindow().setContentView()方法。我们可以看到他调用了getWindow()方法,这个方法返回的是一个window对象。所以我的目标就转移到了Window类 

第二步、Window是一抽象类,它提供标准的UI策略,例如背景、标题区域,默认密钥处理,它只有一个实现类PhoneWindow。我们在PhoneWindow中找到setContentView()方法

/frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java

官网注释:这是放置窗口内容的视图,它要么是DecorView本身,或者是一个DecorView的子view。

这里猜测,mContentParent就是一个放置窗口内容的一个容器,父布局;

再进入installDecor();方法中查看,找到给mContentParent赋值的地方

接着再进入generateLayout()方法,最终找到给mDecor加载资源的地方

这里对象mLayoutInflater就是用来加载布局文件的,layoutResource就是要加载的布局id,前面一堆条件判断就是为layoutResource赋值,

这里layoutResource = R.layout.screen_simple

第三步、此时再找到DecorView中的onResourcesLoaded查看,

/frameworks/base/core/java/com/android/internal/policy/DecorView.java

最终这个资源被加载到跟布局中;

总结一下以上流程,只是做了布局的初始化工作,将布局文件加载到了mContentParent中,但是还没有加载到Window中以及布局的绘制工作都没完成;

这里完成的跟布局大体结构如下:

那么decorView是如何添加到window上的呢,ui又是怎么样渲染绘制上去的呢?请看(二)

相关文章

网友评论

    本文标题:AndroidUI绘制流程,一步一步深入源码解析(一)

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