Android 基本功-View 的工作流程(一)

背景知识

接上一篇,从 startActivity 开始找到了 View 工作流程的入口,接下去就要 View 就要开始工作了,和 View 相关的有哪些概念呢?

PhoneWindow,在 Activity 执行 attach 方法时创建,所以一个 activity 对象实例拥有着一个 PhoneWindow 实例。attach 方法很大一部分工作是用来配置这个 PhoneWindow 实例,所以可以将 attach 方法理解为就是 activity 绑定窗口用的。

另外 PhoneWindow 的工作是由 WindowManager 来负责的,在创建好 PhoneWindow 之后会通过 setWindowManager 设置。WindowManager 是个接口,继承自 ViewManager,ViewManager 主要用作 View 的添加,删除,更新布局。而 WindowManager 的实现类是 WindowManagerImpl,虽说 WindowManagerImpl 是实现类,但其内部基本是通过另一个类 WindowManagerGlobal 完成最终操作的。

DecorView,它是在 activity 执行 onCreate 方法时调用 setContentView 方法内部创建的,可以理解为就是 activity 的根 View。它分为 title 和 content 两部分布局,一般我们不会用 title 部分,content 部分会展示我们设计的 activity xml 布局,一般自定义的 title 也在这部分展示。

ViewRootImpl,它是在 activity 关联的 PhoneWindow 的 WindowManager 添加 DecorView 的时候创建的,可以理解为是一个和具体物理显示屏相关的一个类,通过它来完成 Window 展示 View 的功能。所以 ViewRootImpl 要和 WindowManager,DecorView 打交道。

scheduleTraversales

回到 View 工作流程入口方法 scheduleTraversals() ,

void scheduleTraversals() {
    if (!mTraversalScheduled) {
        mTraversalScheduled = true;
        //Choreographer 通过消息队列机制最终会执行 mTraversalRunnable 里的东西
        mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
    }
}
final class TraversalRunnable implements Runnable {
    public void run() {
        doTraversal();
    }
}
void doTraversal() {
    if (mTraversalScheduled) {
        mTraversalScheduled = false;
        //这个方法是 View 整个工作流程的体现
        //内部主要三个过程,测量,布局,绘制
        //测量主要涉及 measureHierarchy, performMeasure 方法,而这最终对应到 View 的 measure 方法
        //布局主要涉及 performLayout 方法,而这最终对应到 View 的 layout 方法
        //绘制主要涉及 performDraw 方法,这最终对应到 View 的 onDraw 方法
        performTraversals();
    }
}

考虑到 measure, layout, onDraw 每个方法都可以展开分析分析,这篇就先整理个大概,接下去再找时间好好看看。

你可能感兴趣的:(Android 基本功-View 的工作流程(一))