View体系(六)View工作流程入口
View的工作流程,就是View进行measure、layout和draw的过程,本篇文章我们就来一起看一下View是如何开始他的工作流程的。
(注:文中源码基于
Android 12)
在上篇文章《View体系(五)熟悉又陌生的setContentView》中我们讲过Activity的结构,包括了Activity、PhoneWindow及DecorView。讲了PhoneWindow的创建和DecorView的创建,但此时DecorView还没有加载到PhoneWindow中,下面我们就从源码看一下DecorView是如何加载到PhoneWindow中的。
当我们调用Activity的startActivity时,最终会调用到ActivityThread的handleLaunchActivity,代码如下:
android.app.ActivityThread
1 | public Activity handleLaunchActivity(ActivityClientRecord r, |
注释1处调用performLaunchActivity创建了一个Activity,进入performLaunchActivity方法:
android.app.ActivityThread
1 | private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { |
注释1处会通过mInstrumentation的newActivity方法,使用反射的方式,创建Activity的实例,注释2处调用activity.attach方法,在之前的文章中讲过,attach会创建PhoneWindow实例,并赋值给传入的window引用,注释3处最终会调用Activity的OnCreate回调方法,进而调用setContentView方法,创建DecorView。
在Android12的源码中,handleLaunchActivity方法中并不会直接调用handleResumeActivity方法,而是通过ClientTransaction类来实现调用handleLaunchActivity之后再调用handleResumeActivity,具体的放在后面的文章中讲解。
我们继续看handleResumeActivity方法:
android.app.ActivityThread
1 | public void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest, |
注释1处得到了DecorView,注释2处得到了WindowManager对象,注释3处调用WindowManager的addView方法,将DecorView作为参数传入,WindowManager的实现类是WindowManagerImpl,所以实际调用的是WindowManagerImpl的addView方法。再看WindowManagerImpl的addView方法:
android.view.WindowManagerImpl
1 | public void addView( View view, ViewGroup.LayoutParams params) { |
注释1处又调用了WindowManagerGlobal的addView方法:
android.view.WindowManagerGlobal
1 | public void addView(View view, ViewGroup.LayoutParams params, |
注释1处创建了ViewRootImpl实例赋值给root,注释2处将DecorView作为参数传入ViewRootImpl,完成了DecorView和Window的绑定。
ViewRootImpl中还有个方法performTraversals,这个方法使View进入正真的工作流程:
android.view.ViewRootImpl
1 | private void performTraversals() { |
注释1处会执行view的Measure过程,注释2处会执行view的Layout过程,注释3处会执行view的Draw过程。
关注我







