1. 簡(jiǎn)介
本文源碼基于android 27。
startActivity的流程較復(fù)雜,我們這里將其過(guò)程分成三部分:
- startActivity-->ActivityManagerService
- ActivityManagerService-->ApplicationThread
- ApplicationThread-->Activity
這樣看起來(lái)稍微簡(jiǎn)單點(diǎn)。
通常,我們要啟動(dòng)一個(gè)Activity都是直接調(diào)用startActivity,我們就從這里開(kāi)始進(jìn)行分析。
2. startActivity-->ActivityManagerService
ActivityManagerService,后面都簡(jiǎn)稱為AMS。
從調(diào)用startActivity到ActivityManagerService,先放張時(shí)序圖:

可以看到,從調(diào)用startActivity到ActivityManagerService之間的過(guò)程其實(shí)并不復(fù)雜。
下面開(kāi)始進(jìn)入源碼分析,首先來(lái)看下Activity中的startActivity方法。
2.1 Activity的startActivity
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
if (options != null) {
//第二個(gè)參數(shù)為-1,表示不需要知道Activity啟動(dòng)的結(jié)果
startActivityForResult(intent, -1, options);
} else {
startActivityForResult(intent, -1);
}
}
startActivity會(huì)調(diào)用startActivityForResult方法
2.2 Activity的startActivityForResult
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {//mParent表示當(dāng)前Activity的父類,一般為null
options = transferSpringboardActivityOptions(options);
//調(diào)用Instrumentation.execStartActivity(),啟動(dòng)新的Activity。
//mMainThread類型為ActivityThread, 在attach()時(shí)被回調(diào)時(shí)被賦值。
Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
if (requestCode >= 0) {
mStartedActivity = true;
}
cancelInputsAndStartExitTransition(options);
} else {
if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
mParent.startActivityFromChild(this, intent, requestCode);
}
}
}
mMainThread.getApplicationThread()會(huì)獲得一個(gè)ApplicationThread,ApplicationThread是ActivityThread里的一個(gè)內(nèi)部類,后面會(huì)用到。
接著調(diào)用Instrumentation的execStartActivity方法
2.3 Instrumentation的execStartActivity
Instrumentation類主要用來(lái)監(jiān)控應(yīng)用程序和系統(tǒng)的交互。
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
//將contextThread轉(zhuǎn)成ApplicationThread.
IApplicationThread whoThread = (IApplicationThread) contextThread;
Uri referrer = target != null ? target.onProvideReferrer() : null;
if (referrer != null) {
intent.putExtra(Intent.EXTRA_REFERRER, referrer);
}
if (mActivityMonitors != null) {
synchronized (mSync) {
final int N = mActivityMonitors.size();
for (int i=0; i<N; i++) {
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
result = am.onStartActivity(intent);
}
if (result != null) {
am.mHits++;
return result;
} else if (am.match(who, null, intent)) {
am.mHits++;
if (am.isBlocking()) {
return requestCode >= 0 ? am.getResult() : null;
}
break;
}
}
}
}
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
//實(shí)際上這里是通過(guò)AIDL來(lái)調(diào)用AMS的startActivity方法,下面我們看下ActivityManager.getService()的代碼
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);//檢查StartActivity的結(jié)果
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
我們先來(lái)看下ActivityManager.getService()中的代碼
2.4 ActivityManager的getService
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
//創(chuàng)建一個(gè)單例IActivityManager
private static final Singleton<IActivityManager> IActivityManagerSingleton =new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
//獲取一個(gè)關(guān)聯(lián)ActivityManagerService的Binder對(duì)象
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
//返回一個(gè)IActivityManager的代理對(duì)象,基于Binder機(jī)制,通過(guò)調(diào)用代理對(duì)象的方法,能夠調(diào)用到ActivityManagerService相應(yīng)的方法
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
Instrumentation中通過(guò)Binder調(diào)用了AMS的startActivity方法,這樣就到了AMS中去了。。
從Activity的startActivity到AMS的startActivity,實(shí)際上還是比較簡(jiǎn)單的,下面就交給AMS來(lái)處理了。
3. AMS-->ApplicationThread
下面我們來(lái)看下AMS到ApplicationThread的過(guò)程。還是先放時(shí)序圖:

相比于startActivity-->AMS,AMS-->ApplicationThread流程看起來(lái)復(fù)雜好多了,實(shí)際上里面大多數(shù)都是一些細(xì)節(jié)處理。我們對(duì)主要流程分析一下,細(xì)節(jié)部分就略過(guò)了。
首先來(lái)看下AMS的startActivity方法:
3.1 AMS的startActivity
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}
就是調(diào)用了startActivityAsUser
3.2 AMS的startActivityAsUser
@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
enforceNotIsolatedCaller("startActivity");//檢查調(diào)用者是否合法
userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, false, ALLOW_FULL_ONLY, "startActivity", null);)//檢查調(diào)用者是否有權(quán)限執(zhí)行操作
return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
profilerInfo, null, null, bOptions, false, userId, null, "startActivityAsUser");
}
startActivityAsUser實(shí)際上就是檢查一下調(diào)用者的權(quán)限。
然后就是調(diào)用ActivityStarter的startActivityMayWait。
3.3 ActivityStarter的startActivityMayWait
ActivityStarter這個(gè)類看名字就知道是用來(lái)啟動(dòng)Activity的,好多啟動(dòng)細(xì)節(jié)都是在ActivityStarter里面處理的。我們先來(lái)看下startActivityMayWait:
startActivityMayWait中主要是解析Intent的信息。
接著就是調(diào)用startActivityLocked了。后面分析。
最后如果需要返回結(jié)果,會(huì)執(zhí)行mService.wait(),所以這里叫MayWait。
相關(guān)代碼細(xì)節(jié)這里就不分析了,抓住主要部分。
final int startActivityMayWait(IApplicationThread caller, int callingUid,
String callingPackage, Intent intent, String resolvedType,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, WaitResult outResult,
Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
TaskRecord inTask, String reason) {
//...
//解析Intent信息等等
int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType,
aInfo, rInfo, voiceSession, voiceInteractor,
resultTo, resultWho, requestCode, callingPid,
callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
options, ignoreTargetSecurity, componentSpecified, outRecord, inTask,
reason);
//...
//判斷是否需要返回結(jié)果
return res;
}
接著看startActivityLocked
3.4 ActivityStarter的startActivityLocked
int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
ActivityRecord[] outActivity, TaskRecord inTask, String reason) {
//...
mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
inTask);
//...
}
startActivityLocked比較簡(jiǎn)單,就是調(diào)用的startActivity
3.5 ActivityStarter的startActivity
這里的startActivity主要是檢查啟動(dòng)權(quán)限,創(chuàng)建新的ActivityRecord等等,相關(guān)細(xì)節(jié)不說(shuō)。
private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
ActivityRecord[] outActivity, TaskRecord inTask) {
//...
//檢查啟動(dòng)權(quán)限
//創(chuàng)建ActivityRecord
return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true,
options, inTask, outActivity);
}
可以看到,這里會(huì)調(diào)另外一個(gè)重載的startActivity方法。
這里的startActivity主要是讓WindowManager暫停布局。
private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
ActivityRecord[] outActivity) {
int result = START_CANCELED;
try {
mService.mWindowManager.deferSurfaceLayout();//暫停布局
result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
startFlags, doResume, options, inTask, outActivity);
//繼續(xù)布局
//...
}
繼續(xù)看startActivityUnchecked
3.6 ActivityStarter的startActivityUnchecked
startActivityUnchecked主要處理intent攜帶的launch flags, 啟動(dòng)模式(launchMode)等等。
如果有需要,Activity任務(wù)(TaskRecord)會(huì)在這里創(chuàng)建。
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
ActivityRecord[] outActivity) {
//...
mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,
mOptions);
//...
}
然后會(huì)調(diào)用ActivityStackSupervisor的resumeFocusedStackTopActivityLocked。
3.7 ActivityStackSupervisor的resumeFocusedStackTopActivityLocked
ActivityStackSupervisor實(shí)際上是用來(lái)管理Activity任務(wù)棧(ActivityStack)的。
resumeFocusedStackTopActivityLocked中首先判斷FocusedStack棧中是否存在target ActivityStack,
然后就是調(diào)用ActivityStack的resumeTopActivityUncheckedLocked。
boolean resumeFocusedStackTopActivityLocked(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
//...
if (targetStack != null && isFocusedStack(targetStack)) {
return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
//...
}
繼續(xù)往下看
3.8 ActivityStack的resumeTopActivityUncheckedLocked
ActivityStack就是任務(wù)棧,用來(lái)管理Activity任務(wù)(TaskRecord),而上面的ActivityStackSupervisor實(shí)際上用來(lái)管理ActivityStack的。
resumeTopActivityUncheckedLocked中首先會(huì)判斷是否在ResumeTopActivity狀態(tài)中。
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
if (mStackSupervisor.inResumeTopActivity) {
// Don't even start recursing.
return false;
}
boolean result = false;
try {
// Protect against recursion.
mStackSupervisor.inResumeTopActivity = true;
result = resumeTopActivityInnerLocked(prev, options);
} finally {
mStackSupervisor.inResumeTopActivity = false;
}
//...
return result;
}
然后就是調(diào)用resumeTopActivityInnerLocked
3.9 ActivityStack的resumeTopActivityInnerLocked
resumeTopActivityInnerLocked中首先暫停當(dāng)前Activity,然后啟動(dòng)新Activity。
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
//...
if (mResumedActivity != null) {
if (DEBUG_STATES) Slog.d(TAG_STATES,
"resumeTopActivityLocked: Pausing " + mResumedActivity);
//暫停當(dāng)前activity,調(diào)用Activity的onPause
pausing |= startPausingLocked(userLeaving, false, next, false);
}
//...
mStackSupervisor.startSpecificActivityLocked(next, true, true);//啟動(dòng)新activity
//...
}
startPausingLocked最終會(huì)調(diào)用到AMS中,AMS再通過(guò)調(diào)用相應(yīng)的方法,然后調(diào)用resumeTopActivityInnerLocked再調(diào)用到mStackSupervisor.startSpecificActivityLocked。細(xì)節(jié)不表,只需知道這中間會(huì)經(jīng)過(guò)AMS就好了。
然后繼續(xù)看ActivityStackSupervisor的startSpecificActivityLocked
3.10 ActivityStackSupervisor的startSpecificActivityLocked
startSpecificActivityLocked中先獲取ProcessRecord(若要啟動(dòng)的Activity的應(yīng)用已經(jīng)在運(yùn)行),若ProcessRecord存在則直接調(diào)用realStartActivityLocked(),否則調(diào)用 ActivityManagerServices.startProcessLocked()創(chuàng)建新的ProcessRecord。
void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) {
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);//獲取ProcessRecord
r.getStack().setLaunchTime(r);
if (app != null && app.thread != null) {
try {
if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
|| !"android".equals(r.info.packageName)) {
app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
mService.mProcessStats);
}
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
Slog.w(TAG, "Exception when starting activity "
+ r.intent.getComponent().flattenToShortString(), e);
}
}
//創(chuàng)建新的ProcessRecord
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
繼續(xù)看realStartActivityLocked
3.11 ActivityStackSupervisor的realStartActivityLocked
直接看碼
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException {
//...
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info,
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, !andResume,
mService.isNextTransitionForward(), profilerInfo);
//...
}
這里的app.thread實(shí)際上就是ApplicationThread,可以看到,兜兜轉(zhuǎn)轉(zhuǎn)之后終于到了ApplicationThread。
4. ApplicationThread-->Activity
先來(lái)看相應(yīng)的時(shí)序圖:

從ApplicationThread到真正啟動(dòng)一個(gè)Activity,其實(shí)也并不是很復(fù)雜。
4.1 ApplicationThread的scheduleLaunchActivity
ApplicationThread是ActivityThread的內(nèi)部類。
scheduleLaunchActivity中就是將啟動(dòng)Activity的參數(shù)封裝成ActivityClientRecord,然后調(diào)用ActivityThread的sendMessage方法。
@Override
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
int procState, Bundle state, PersistableBundle persistentState,
List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
updateProcessState(procState, false);
ActivityClientRecord r = new ActivityClientRecord();
r.token = token;
r.ident = ident;
r.intent = intent;
r.referrer = referrer;
r.voiceInteractor = voiceInteractor;
r.activityInfo = info;
r.compatInfo = compatInfo;
r.state = state;
r.persistentState = persistentState;
r.pendingResults = pendingResults;
r.pendingIntents = pendingNewIntents;
r.startsNotResumed = notResumed;
r.isForward = isForward;
r.profilerInfo = profilerInfo;
r.overrideConfig = overrideConfig;
updatePendingConfiguration(curConfig);
//調(diào)用ActivityThread的sendMessage方法,發(fā)送LAUNCH_ACTIVITY信息
sendMessage(H.LAUNCH_ACTIVITY, r);
}
4.2 ActivityThread的sendMessage
sendMessage實(shí)際就是給一個(gè)名為mH的Handler發(fā)信息。
private void sendMessage(int what, Object obj) {
sendMessage(what, obj, 0, 0, false);
}
private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
if (DEBUG_MESSAGES) Slog.v(
TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
+ ": " + arg1 + " / " + obj);
Message msg = Message.obtain();
msg.what = what;
msg.obj = obj;
msg.arg1 = arg1;
msg.arg2 = arg2;
if (async) {
msg.setAsynchronous(true);
}
mH.sendMessage(msg);
}
我們看看H這個(gè)類
4.3 H類
private class H extends Handler { //繼承Handler
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
switch (msg.what) {
case LAUNCH_ACTIVITY: {//啟動(dòng)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, "LAUNCH_ACTIVITY");
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case RELAUNCH_ACTIVITY: {
//...
} break;
case PAUSE_ACTIVITY: {
//...
} break;
case PAUSE_ACTIVITY_FINISHING: {
//...
} break;
可以看到H里面會(huì)對(duì)各種狀態(tài)進(jìn)行處理。LAUNCH_ACTIVITY中會(huì)調(diào)用handleLaunchActivity,繼續(xù)往下看。
4.4 ActivityThread的handleLaunchActivity
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
//...
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
reportSizeConfigurations(r);
Bundle oldState = r.state;
//這里最終會(huì)調(diào)用Activity的onResume生命周期
handleResumeActivity(r.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
//...
}
最終會(huì)調(diào)用performLaunchActivity
4.5 ActivityThread的performLaunchActivity
看代碼中的注釋吧
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
//從ActivityClientRecord中獲取要啟動(dòng)的Activity信息
ActivityInfo aInfo = r.activityInfo;
if (r.packageInfo == null) {
r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
Context.CONTEXT_INCLUDE_CODE);
}
ComponentName component = r.intent.getComponent();
if (component == null) {
component = r.intent.resolveActivity(
mInitialApplication.getPackageManager());
r.intent.setComponent(component);
}
if (r.activityInfo.targetActivity != null) {
component = new ComponentName(r.activityInfo.packageName,
r.activityInfo.targetActivity);
}
//ContextImpl在這里創(chuàng)建,ContextImpl是Context的具體實(shí)現(xiàn)
ContextImpl appContext = createBaseContextForActivity(r);
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.getClassLoader();
//通過(guò)Instrumentation的newActivity使用類加載器來(lái)創(chuàng)建Activity對(duì)象
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
r.intent.prepareToEnterProcess();
if (r.state != null) {
r.state.setClassLoader(cl);
}
}
try {
//創(chuàng)建Application對(duì)象,如果已經(jīng)創(chuàng)建過(guò),則不會(huì)重復(fù)創(chuàng)建,保證一個(gè)應(yīng)用中只有一個(gè)Application對(duì)象;
//實(shí)際上跟Activity一樣也是在Instrumentation中使用類加載器來(lái)創(chuàng)建的
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
if (localLOGV) Slog.v(TAG, "Performing launch of " + r);
if (localLOGV) Slog.v(
TAG, r + ": app=" + app
+ ", appName=" + app.getPackageName()
+ ", pkg=" + r.packageInfo.getPackageName()
+ ", comp=" + r.intent.getComponent().toShortString()
+ ", dir=" + r.packageInfo.getAppDir());
if (activity != null) {
//...
//attach中會(huì)建立Activity與ContextImpl的聯(lián)系
//attach中還會(huì)創(chuàng)建Window并與Window建立聯(lián)系 可以看Activivity中的源碼
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);
//...
if (r.isPersistable()) {
//回調(diào)Activity的OnCreate
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
//回調(diào)Activity的OnCreate
mInstrumentation.callActivityOnCreate(activity, r.state);
}
//...
return activity;
}
再來(lái)看看Instrumentation的callActivityOnCreate
4.6 Instrumentation的callActivityOnCreate
public void callActivityOnCreate(Activity activity, Bundle icicle,
PersistableBundle persistentState) {
prePerformCreate(activity);
activity.performCreate(icicle, persistentState);
postPerformCreate(activity);
}
繼續(xù)看下activity.performCreate
4.7 Activity的performCreate
final void performCreate(Bundle icicle) {
performCreate(icicle, null);
}
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
mCanEnterPictureInPicture = true;
restoreHasCurrentPermissionRequest(icicle);
if (persistentState != null) {
onCreate(icicle, persistentState);//onCreate
} else {
onCreate(icicle);//onCreate
}
mActivityTransitionState.readState(icicle);
mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowNoDisplay, false);
mFragments.dispatchActivityCreated();
mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
}
可以看到,onCreate被調(diào)用起來(lái)了。至此,Activity被啟動(dòng)起來(lái)了。
最后,放張總的時(shí)序圖(圖太大,請(qǐng)另外打開(kāi)或保存):
