源碼分析:Activity生命週期調用順序(二)

Activity生命週期調用順序,接着上篇
源碼分析:Activity聲明週期調用順序(一)

當進入一個Activity後,會執行attach()→onCreate()→onStart()→onRestoreInstanceState()→onPostCreate()→onResume()→onPostResume()等方法

ActivityThread.H 的handleMessage()方法


 public void handleMessage(Message msg) {
			...
            switch (msg.what) {
				//啓動Activity
                case LAUNCH_ACTIVITY: {
                   
                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
					//【注:1】處理啓動的Activity
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
                } break;
			...

【注:1】 handleLaunchActivity()

//我們只看,要打開的activity的聲明週期
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
        ...

        // Make sure we are running with the most recent config.
        handleConfigurationChanged(null, null);

        
        WindowManagerGlobal.initialize();
		//【注:2】 這裏執行了attach跟oncreate等
        Activity a = performLaunchActivity(r, customIntent);

        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            reportSizeConfigurations(r);
            Bundle oldState = r.state;
			//【注:3】 這裏執行了onResume等
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);

            if (!r.activity.mFinished && r.startsNotResumed) {
               
                performPauseActivityIfNeeded(r, reason);

                
                if (r.isPreHoneycomb()) {
                    r.state = oldState;
                }
            }
        } else {
            
            try {
                ActivityManager.getService()
                    .finishActivity(r.token, Activity.RESULT_CANCELED, null,
                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
        }
    }

【注:2】 performLaunchActivity()

 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

        ...

        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;
        
			
            java.lang.ClassLoader cl = appContext.getClassLoader();
			//創建Activity
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            
           

        try {
           

            if (activity != null) {
				...
                //執行activity的onAttach()方法
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);

                
                activity.mCalled = false;
				//執行activity的onCreate()方法
                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
                if (!activity.mCalled) {
                    throw new SuperNotCalledException(
                        "Activity " + r.intent.getComponent().toShortString() +
                        " did not call through to super.onCreate()");
                }
                r.activity = activity;
                r.stopped = true;
                if (!r.activity.mFinished) {
					//執行Activity的onStart()方法
                    activity.performStart();
                    r.stopped = false;
                }
				//執行Activity的onRestoreInstance()方法
                if (!r.activity.mFinished) {
                    if (r.isPersistable()) {
                        if (r.state != null || r.persistentState != null) {
                            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                                    r.persistentState);
                        }
                    } else if (r.state != null) {
                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                    }
                }
				//執行Activity的onPostCreate()
                if (!r.activity.mFinished) {
                    activity.mCalled = false;
                    if (r.isPersistable()) {
                        mInstrumentation.callActivityOnPostCreate(activity, r.state,
                                r.persistentState);
                    } else {
                        mInstrumentation.callActivityOnPostCreate(activity, r.state);
                    }
                }
            }
            r.paused = true;

            mActivities.put(r.token, r);

        return activity;
    }

這裏面執行了Activity的onAttach(),onCreate(),onStart(),onRestoreInstance(),onPostCreate()方法

調用流程,如下圖
執行的第一部分

【注:3】 handleResumeActivity()方法

final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
        ActivityClientRecord r = mActivities.get(token);
        if (!checkAndUpdateLifecycleSeq(seq, r, "resumeActivity")) {
            return;
        }

        unscheduleGcIdler();
        mSomeActivitiesChanged = true;

        // 【注:4】執行onResume
        r = performResumeActivity(token, clearHide, reason);

        if (r != null) {
            final Activity a = r.activity;



            final int forwardBit = isForward ?
                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;


            boolean willBeVisible = !a.mStartedActivity;
            if (!willBeVisible) {
                try {
                    willBeVisible = ActivityManager.getService().willActivityBeVisible(
                            a.getActivityToken());
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
            }
			//這裏是處理Activity的View顯示的,以後會分析
            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;
                        wm.addView(decor, l);
                    } else {
                        // The activity will get a callback for this {@link LayoutParams} change
                        // earlier. However, at that time the decor will not be set (this is set
                        // in this method), so no action will be taken. This call ensures the
                        // callback occurs with the decor set.
                        a.onWindowAttributesChanged(l);
                    }
                }

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

            // Get rid of anything left hanging around.
            cleanUpPendingRemoveWindows(r, false /* force */);

            // The window is now visible if it has been added, we are not
            // simply finishing, and we are not starting another activity.
            if (!r.activity.mFinished && willBeVisible
                    && r.activity.mDecor != null && !r.hideForNow) {
                if (r.newConfig != null) {
                    performConfigurationChangedForActivity(r, r.newConfig);
                    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity "
                            + r.activityInfo.name + " with newConfig " + r.activity.mCurrentConfig);
                    r.newConfig = null;
                }
                WindowManager.LayoutParams l = r.window.getAttributes();
                if ((l.softInputMode
                        & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
                        != forwardBit) {
                    l.softInputMode = (l.softInputMode
                            & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
                            | forwardBit;
                    if (r.activity.mVisibleFromClient) {
                        ViewManager wm = a.getWindowManager();
                        View decor = r.window.getDecorView();
                        wm.updateViewLayout(decor, l);
                    }
                }

                r.activity.mVisibleFromServer = true;
                mNumVisibleActivities++;
                if (r.activity.mVisibleFromClient) {
                    r.activity.makeVisible();
                }
            }

            if (!r.onlyLocalRequest) {
                r.nextIdle = mNewActivities;
                mNewActivities = r;
                if (localLOGV) Slog.v(
                    TAG, "Scheduling idle handler for " + r);
                Looper.myQueue().addIdleHandler(new Idler());
            }
            r.onlyLocalRequest = false;

            // Tell the activity manager we have resumed.
            if (reallyResume) {
                try {
                    ActivityManager.getService().activityResumed(token);
                } catch (RemoteException ex) {
                    throw ex.rethrowFromSystemServer();
                }
            }

        } else {
            // 當Activity執行onResume時候出現異常,就直接關閉它
            try {
                ActivityManager.getService()
                    .finishActivity(token, Activity.RESULT_CANCELED, null,
                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
        }
    }

這個放出除了調用了,接下來要【注:4】performResumeActivity()方法,還處理了Activity顯示View的邏輯。這裏,我們只看需要打開的Activity的聲明週期調用。接下來,看【注:4】。

【注:4】performResumeActivity()方法

public final ActivityClientRecord performResumeActivity(IBinder token,
            boolean clearHide, String reason) {
        ActivityClientRecord r = mActivities.get(token);
        if (r != null && !r.activity.mFinished) {
				//...省略代碼
				//
                r.activity.performResume();
				//...省略代碼
            
        }
        return r;
    }

調用activity的performResume();

final void performResume() {
		//1,執行performRestart
        performRestart();
		
		//...省略代碼

        mCalled = false;
        // 2,通過Instrumentation調用onResume
        mInstrumentation.callActivityOnResume(this);
        //3,執行onPostResume()方法
		onPostResume();
    }

1,執行performRestart()方法都做了什麼

final void performRestart() {
		//...省略代碼
		//如果mStopped爲true的話。會執行下面onRestart()方法
		//後面我們早onStop()之後,mStopped會置爲true
        if (mStopped) {
            mStopped = false;

            mCalled = false;
			//調用activity的onRestart()方法
            mInstrumentation.callActivityOnRestart(this);
            if (!mCalled) {
                throw new SuperNotCalledException(
                    "Activity " + mComponent.toShortString() +
                    " did not call through to super.onRestart()");
            }
			//...省略代碼
            performStart();
        }
    }

這個方法,都是只有在,mStopped=true的情況下才會執行。
這裏的mStopped其實在Activity的onStop()方法纔會置爲true,執行了onRestart(),
最後調用了performStart()這個方法

final void performStart() {
        mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
		//調用了Instrumentation.callActivityOnStart(this);
        mInstrumentation.callActivityOnStart(this);
		//省略代碼

這裏執行了onStart()方法。
到這裏,我們結合上面mStopped變量,就知道了performRestart()方法執行的流程。onStop()-onRestart()-onStart(),就是在跳轉Activity,返回的時候,執行的。
最後,看下Instrumentation裏面的方法。我們發現,其實Activity的聲明週期都是通過Instrumentation類來實現的。

public class Instrumentation {
	public void callActivityOnResume(Activity activity) {
        activity.mResumed = true;
        //這裏看到,最終調用了onResume()
		activity.onResume();
        
    }
	 public void callActivityOnRestart(Activity activity) {
     	//調用onRestart
   		activity.onRestart();
    }
    public void callActivityOnStart(Activity activity) {
        activity.onStart();
    }
}

handleResumeActivity()方法的流程圖
Activity執行的第二部分

到這裏就全部看完了。通過分析可以看到Activity的聲明週期調用都是通過Instrumentation來調用的。

從ActivityThread.H的LAUNCH_ACTIVITY消息的執行流程圖。

第二大部分整體圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章