上一篇我們講到AMS在被遠程調用attachApplication
方法後,會在attachApplicationLocked
方法裏遠程調用ApplicationThread
的bindApplication
創建Application
對象。實際上attachApplicationLocked
方法不止進行了Application
對象的創建在創建完Application
對象後還進行了Activity
的創建,我們這次多看一點它的源碼
1.ActivityManagerService
#attachApplicationLocked
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid) {
......
try {
......
//1.發送啓動Application
thread.bindApplication(...);
......
} catch (Exception e) {
......
return false;
}
......
if (normalMode) {
try {
//2.啓動activity
if (mStackSupervisor.attachApplicationLocked(app)) {
didSomething = true;
}
} catch (Exception e) {
...
}
}
......
return true;
}
可以看到它執行了mStackSupervisor.attachApplicationLocked(app)
方法去創建一個Activity
,mStackSupervisor
是一個ActivityStackSupervisor
類型的對象,下面看該方法的源碼
boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
...
try {
//調用realStartActivityLocked方法真正啓動activity
if (realStartActivityLocked(hr, app, true, true)) {
didSomething = true;
}
} catch (RemoteException e) {
...
}
...
return didSomething;
}
接下來是realStartActivityLocked
方法
final boolean realStartActivityLocked(ActivityRecord r,
ProcessRecord app, boolean andResume, boolean checkConfig)
throws RemoteException {
......
try {
......
app.thread.scheduleLaunchActivity(...);
......
} catch (RemoteException e) {
......
}
......
return true;
}
可以看到最後通過調用app.thread.scheduleLaunchActivity
方法進行創建Activity
,而app.thread
就是
之前講的mAppThread
對象的Binder代理對象,也就是說此時AMS又通過Binder機制遠程調用了ApplicationThread
的scheduleLaunchActivity
方法去進行Activity
創建。
2.ApplicationThread
#scheduleLaunchActivity
方法
@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) {
...
//將消息交給H類型的mH處理
sendMessage(H.LAUNCH_ACTIVITY, r);
}
可以看到Application的創建一樣,通過Handler機制發送了H.LAUNCH_ACTIVITY
消息交給了H
類進行分發處理,而實際上H
類將其交給ActivityThread
的handleLaunchActivity
方法進行處理
3.ActivityThread
#handleLaunchActivity
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
//1.執行Activity的初始化及oncreate方法
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
......
//2.執行Activity的onResume方法
handleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed);
......
} else {
......
}
}
實際的Activity創建是交給performLaunchActivity
方法處理的
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
Activity activity = null;
try {
...
//1.創建activity
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
...
} catch (Exception e) {
...
}
try {
//2.創建Application,實質上Application已經創建,只是獲得已有的Application 實例
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
......
if (activity != null) {
//3.創建context
Context appContext = createBaseContextForActivity(r, activity);
......
//4.將Context和Application 與activity關聯起來,完成activity的初始化
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);
//5.調用activity的oncreate方法
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
......
} catch (SuperNotCalledException e) {
...
}
return activity;
}
實際創建 Activity
這裏還是使用 Instrumentation
的對象,而mInstrumentation.newActivity
方法跟
newApplication
方法一樣用反射創建出Activity
創建出Activity
後performLaunchActivity
方法開始使用mInstrumentation
調用 Activity
的聲onCreate
生命週期