Activity启动后window和View的绘制流程

创建window过程

当我们调用startActivity方法之后系统会通过AMS等一系列的方法最后调用ActivityThreadperformLaunchActivity方法,在方法里会调用attach方法

Activity启动后window和View的绘制流程_第1张图片
image.png

Activity的attach方法里面系统会初始化Window的实现类PhoneWindow并通过setWindowManager方法创建mWindowManager的实现类WindowManagerImpl

Activity启动后window和View的绘制流程_第2张图片
image.png

setContentView过程

创建完之后ActivityThread会继续执行performLaunchActivity方法调用InstrumentationcallActivityOnCreate方法,然后会调用activity的OnCreate

Activity启动后window和View的绘制流程_第3张图片
image.png

然后我们在OnCreate里面调用setContentView,点进去可以看到是调用Window的setContentView方法,从前一步我们知道其实就是调用的window的实现类 PhoneWindow的setContentView
image.png

PhoneWindow的setContentView方法源码

Activity启动后window和View的绘制流程_第4张图片
image.png

在这个方法里面会初始化 DecorView然后将我们xml的布局文件转换成View最后加到DecorView的id为 content的FrameLayout

View的绘制

之后ActivityThread会继续执行handleResumeActivity方法里面会调用performResumeActivity调用完就会执行Activity的onResume方法之后继续走才开始View的绘制所以View的绘制是在Activity生命周期onResume之后的

    @Override
    public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,
            String reason) {
        //调用Activity的onResume
        final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);

        if (r.window == null && !a.mFinished && willBeVisible) {
            r.window = r.activity.getWindow();
            View decor = r.window.getDecorView();
            decor.setVisibility(View.INVISIBLE);
            ViewManager wm = a.getWindowManager();
            WindowManager.LayoutParams l = r.window.getAttributes();
            a.mDecor = decor;
            l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
            l.softInputMode |= forwardBit;
            if (r.mPreserveWindow) {
                a.mWindowAdded = true;
                r.mPreserveWindow = false;
                ViewRootImpl impl = decor.getViewRootImpl();
                if (impl != null) {
                    impl.notifyChildRebuilt();
                }
            }
            if (a.mVisibleFromClient) {
                if (!a.mWindowAdded) {
                    a.mWindowAdded = true;
                  //调用ViewManager的实现类WindowManagerImpl window创建的时候有提到
                    wm.addView(decor, l);
                } else {
                    a.onWindowAttributesChanged(l);
                }
            }

        } else if (!willBeVisible) {
            if (localLOGV) Slog.v(TAG, "Launch " + r + " mStartedActivity set");
            r.hideForNow = true;
        }
    }

然后会执行WindowManagerImpl的addView方法
WindowManagerImpl是通过WindowManagerGlobal的addView方法

Activity启动后window和View的绘制流程_第5张图片
image.png

WindowManagerGlobal的addView方法

Activity启动后window和View的绘制流程_第6张图片
image.png

在addView方法里面会创建 ViewRootImpl它是连接WindowManager和DecorView的纽带,View的绘制流程就是通过 ViewRootImpl实现的,通过 root.setView(view, wparams, panelParentView);

View的绘制流程

在setView方法中会调用requestLayout()

Activity启动后window和View的绘制流程_第7张图片
image.png

其中 checkThread检测是否在主线程不是会抛出异常所以 更新UI必须在主线程就是在这里控制额
Activity启动后window和View的绘制流程_第8张图片
image.png

然后调用 scheduleTraversals()通过方法里面的mTraversalRunnable的run执行 doTraversal
Activity启动后window和View的绘制流程_第9张图片
image.png

Activity启动后window和View的绘制流程_第10张图片
image.png

继续调用 doTraversal方法里面的performTraversals()在performTraversals()方法里面会依次调用View的 performMeasure,performLayout,performDraw在各自的方法里面会调用对应的的View的 measure,layout,draw在然后就会走View的 onMeasure,onLayout,onDraw,至此View的绘制完成Acticity就会展示我们的页面

你可能感兴趣的:(Activity启动后window和View的绘制流程)