1. startActivityForResult
Activity中的startActivity()方法有多種重載方法,但是無論以任何方式啟動,最終都會調用startActivityForResult()方法
startActivityForResult()方法中會調用Instrumentation中的execStartActivity()方法
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity( //重點考察方法
this, mMainThread.getApplicationThread(), mToken, this, //getApplicationThread()
intent, requestCode, options);
}
...
}
另外在startActivityForResult()方法中會傳入ApplicationThread參數,在后續的方法中會用到
2. execStartActivity
execStartActivity中會調用ActivityManagerNative類的getDefault()方法
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
...
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess();
int result = ActivityManagerNative.getDefault() //獲取AMS
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
}
return null;
}
這里可以看做是一個AIDL結構
ActivityManagerNative是一個繼承自Binder并實現了IActivityManager接口的抽象類,實際上其為IActivityManager的Stub類(Stub類詳見AIDL結構)
3. getDefault
getDefault()中會獲取靜態變量gDefault,gDefault的具體初始化如下:
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity"); //通過ServiceManager獲取到AMS
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b); //將AMS轉化為IActivityManager
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};
}
static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj); //將AMS作為參數傳入,作為IBinder對象被ActivityManagerProxy持有
}
首先通過ServiceManager獲取到ActivityManagerService(簡稱AMS), 再調用asInterface(b)以AMS為參數構建ActivityManagerProxy對象
在ActivityManagerProxy請求調用Service方法時,其中的transact()方法會讓AMS執行相應方法(如startActivity()方法)
4. startActivity
AMS的startActivity()方法會轉到ActivityStackSupervisor類中執行,再跳轉到ActivityStack類中執行,然后又跳轉回ActivityStackSupervisor,中間過程比較復雜
但最后會執行ActivityStackSupervisor中的realStartActivityLocked()方法
final boolean realStartActivityLocked(ActivityRecord r,
ProcessRecord app, boolean andResume, boolean checkConfig)
throws RemoteException {
...
ProfilerInfo profilerInfo = profileFile != null
? new ProfilerInfo(profileFile, profileFd, mService.mSamplingInterval,
mService.mAutoStopProfiler) : null;
app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
r.compat, r.launchedFromPackage, r.task.voiceInteractor, app.repProcState,
r.icicle, r.persistentState, results, newIntents, !andResume,
mService.isNextTransitionForward(), profilerInfo);
...
}
realStartActivityLocked()中會調用ApplicationThread中的scheduleLauchActivity()
5. scheduleLauchActivity
ApplicationThread對象繼承于ApplicationThreadNative,ApplicationThreadNative繼承自Binder并實現了IApplicationThread接口,同樣可視為Service
scheduleLauchActivity()方法中將啟動Activity的消息交由Handler H 進行處理
Handler H 中在處理啟動Activity消息時,調用ActivityThread中的performLaunchActivity方法
6. performLaunchActivity
performLaunchActivity()中主要有以下步驟
從ActivityClientRecord中獲取待啟動Activity的組建信息
通過Instrumentation的newActivity方法使用反射的方式創建Activity對象
根據ActivityThread創建ContextImpl(appContext)
通過Instrumentation的newApplication方法使用反射的方式創建Application對象,若Application對象已經被創建,則不會重復創建
7. onCreate
通過Instrumentation調用Activity的各生命周期方法。