在 Android Launcher啓動應用程序流程源碼解析一文中從點擊應用程序圖標startActivity()
開始,一直講解到Application
和MainActivity
的onCreate()
方法被調用。中間流程有些高能,高能部分是兩篇博文共有的地方,沒辦法繞開。本文主要講述從Activity#onCreate()
到Activity#onResume()
的流程。想追本溯源的同窗建議先閱讀 Android Launcher啓動應用程序流程源碼解析以後,再回頭讀這篇博文。不囉嗦了,Here we Go~java
不管顯式仍是隱式啓動Activity
,都會進入到ActivityThread#handleLaunchActivity()
android
源碼位置:frameworks/base/core/Java/Android/app/ActivityThread.java
ActivityThread#handleLaunchActivity()app
private final void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) { ...... // 加載activity,而後調用onCreate,onStart方法 Activity a = performLaunchActivity(r, customIntent); if (a != null) { // 調用onResume方法 handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed); ... } ... }
註釋有點劇透,,今天的重點全在這個方法裏。首先看下performLaunchActivity()
ide
ActivityThread#performLaunchActivity()this
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ... Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); ... } ... try { Application app = r.packageInfo.makeApplication(false, mInstrumentation); if (activity != null) { ... activity.attach(...) ... if (r.isPersistable()) { mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnCreate(activity, r.state); } ... if (!r.activity.mFinished) { activity.performStart(); r.stopped = false; } ... return activity; }
mInstrumentation.callActivityOnCreate
這行代碼的做用就是調用Activity#onCreate()
,在 Android Launcher啓動應用程序流程源碼解析已經介紹過,這裏就再也不贅述了。直接看activity.performStart()
,這個方法的名字十分吸引人吶~跟進。spa
源碼位置:frameworks/base/core/java/android/app/Activity.java
Activity#performStart().net
final void performStart() { mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); mFragments.noteStateNotSaved(); mCalled = false; mFragments.execPendingActions(); mInstrumentation.callActivityOnStart(this); if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + " did not call through to super.onStart()"); } mFragments.dispatchStart(); mFragments.reportLoaderStart(); mActivityTransitionState.enterReady(this); }
真相已經呼之欲出了~,跟進。code
源碼位置:frameworks/base/core/java/android/app/Instrumentation.java
Instrumentation#callActivityOnStart()component
public void callActivityOnStart(Activity activity) { activity.onStart(); }
哈哈~又找到一個方法Activity#onStart()
。真是垂手可得~
如今回到ActivityThread#performLaunchActivity()
中的handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed)
,跟進。orm
源碼位置:frameworks/base/core/java/android/app/ActivityThread.java
ActivityThread#handleResumeActivity()
ActivityThread#ActivityClientRecord()
final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume) { ... ActivityClientRecord r = performResumeActivity(token, clearHide); ... } public final ActivityClientRecord performResumeActivity(IBinder token, boolean clearHide) { ... r.activity.performResume(); ... }
中間都是各類狀態效驗,沒撒好說的。直接跟進。
源碼位置:frameworks/base/core/java/android/app/Activity.java
Activity#performResume()
final void performResume() { performRestart(); ... mInstrumentation.callActivityOnResume(this); ... }
在這裏有兩個分支
1. 在執行onResume()
前須要先執行onRestart()
和onStart()
。例如從上個Activity
返回的時候,這裏不做爲重點,但也會稍微看下。
2. 直接執行onResume()
分支1:
Activity#performRestart()
final void performRestart() { ... mInstrumentation.callActivityOnRestart(this); performStart(); }
這兩個方法在上文都分析過了,再也不贅述。
分支2:
源碼位置:frameworks/base/core/java/android/app/Instrumentation.java
Instrumentation#callActivityOnStart()
public void callActivityOnResume(Activity activity) { activity.mResumed = true; activity.onResume(); if (mActivityMonitors != null) { synchronized (mSync) { final int N = mActivityMonitors.size(); for (int i=0; i<N; i++) { final ActivityMonitor am = mActivityMonitors.get(i); am.match(activity, activity, activity.getIntent()); } } } }
直接調用Activity#OnResume()
。
結束了。這篇博客結束的比以前任何一篇博文都要快,都要好理解。這一切的前提是已經閱讀過我原來的博文 Android Launcher啓動應用程序流程源碼解析。