上一篇我们讲到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
生命周期