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的聲明週期調用都是通過Instrumentation來調用的。
從ActivityThread.H的LAUNCH_ACTIVITY消息的執行流程圖。