Android

Activity的生命周期和绘制流程

2019-02-27  本文已影响0人  Peakmain

我之前分析了Activity的启动流程,若不熟悉的可以看上篇文章App启动——Activity的启动流程
由之前文章我们可以知道最终Activity进入ActivityThread并发送名为LAUNCH_ACTIVITY的消息,最终会走到handleMessage方法

    case LAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
                    handleLaunchActivity(r, null);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;

handleLaunchActivity源码:这里后期还会回来分析

 private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        Activity a = performLaunchActivity(r, customIntent);

        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            Bundle oldState = r.state;
           //2
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed);

            if (!r.activity.mFinished && r.startsNotResumed) {
                  try {
                    r.activity.mCalled = false;
                    mInstrumentation.callActivityOnPause(r.activity);
                   if (r.isPreHoneycomb()) {
                        r.state = oldState;
                    }
                 //代码省略
                } catch (SuperNotCalledException e) {
                    throw e;
                } catch (Exception e) {
                    //代码省略
                }
                r.paused = true;
            }
           //代码省略
        } 
    }

performLaunchActivity源码上篇已经说过不再阐述,实际调用的是Activity的onCreate方法

handleResumeActivity源码分析

final void handleResumeActivity(...) {
        ActivityClientRecord r = performResumeActivity(token, clearHide);
    }
   public final ActivityClientRecord performResumeActivity(..){
       //代码省略
        r.activity.performResume();
  if (!r.activity.mFinished && r.startsNotResumed) {
                    try {
                    r.activity.mCalled = false;
                    mInstrumentation.callActivityOnPause(r.activity);
                  if (r.isPreHoneycomb()) {
                        r.state = oldState;
                    }
                //代码省略
        }
if (r.window == null && !a.mFinished && willBeVisible) {
               //代码省略
                if (a.mVisibleFromClient) {
                    a.mWindowAdded = true;
                    wm.addView(decor, l);
                }
            }
}

r.activity.performResume实际调用的是Activity的Resume

final void performResume() {
        performRestart();
   //代码省略
        // Now really resume, and install the current status bar and menu.
        mCalled = false;
   //代码省略
        mFragments.dispatchResume();
        mFragments.execPendingActions();
         //代码省略
      mInstrumentation.callActivityOnResume(this);
    }

performRestart源码

final void performRestart() {
    //代码省略
        if (mStopped) {//停止的状态
            mStopped = false;
      //代码省略
           mCalled = false;
            mInstrumentation.callActivityOnRestart(this);
               performStart();
        }
    }

mInstrumentation.callActivityOnRestart(this)实际调用的是activity的onRestart方法

performStart()源码分析;

final void performStart() {
//代码省略
 mInstrumentation.callActivityOnStart(this);
}

实际调用的是Instrumentation中的callActivityOnStrart方法

   public void callActivityOnStart(Activity activity) {
        activity.onStart();
    }

我们可以看到performStart实际调用的是onStart方法

现在我们回到r.activity.performResume方法中,看 mInstrumentation.callActivityOnResume(this);

    public void callActivityOnResume(Activity activity) {
        activity.mResumed = true;
        activity.onResume();
        //代码省略
    }

实际调用的是Activity的onResume方法

我们这时候再回到handleResumeActivity中看 wm.addView(decor, l);的源码

public interface ViewManager
{
    public void addView(View view, ViewGroup.LayoutParams params);
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    public void removeView(View view);
}

可以看到实际是个抽象类,我们看wm是怎么被实例化的

//我们会发现这个方法会创建一个WindowManager
 ViewManager wm = a.getWindowManager();

 public WindowManager getWindowManager() {
        return mWindowManager;
    }

我们都知道WindowManager的实现类是PhoneWindow,查看其getWindowManager源码,我们会发现,实际这个走的是Window中的getWindowManager()方法

//实际最终创建的是WindowManagerImpl这个实例,查看这个源码中的addView方法
 mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
   @Override
    public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
        applyDefaultToken(params);
        mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
    }

WindowMangerImp中的addView源码分析

ViewRootImpl root;
 root = new ViewRootImpl(view.getContext(), display);
  try { 
            //设置view进去
                root.setView(view, wparams, panelParentView);
            } catch (RuntimeException e) {
                // BadTokenException or InvalidDisplayException, clean up.
                if (index >= 0) {
                    removeViewLocked(index, true);
                }
                throw e;
            }

调用的ViewRootImpl中的setView方法,调用其中的 requestLayout()-> scheduleTraversals();->mTraversalRunnable->doTraversal->performMeasure->view的measure-.onMeasure方法这时候我们就看到了onMeasure实际是在onResume方法之后调用的

上一篇下一篇

猜你喜欢

热点阅读