查看源码分析得出结论。
通常我们启动一个activity是通过Activity的startActivity方法,其内部调用的是Activity中的startActivityForResult(intent, requestCode, options);方法,而在startActivityForResult中调用的是 Instrumentation的 execStartActivity。
Instrumentation:会在应用程序的任何代码初始化之前被初始化,作用是监控 应用程序 和 系统的交互。
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
......
try {
......
//在此通过binder完成跨进程间的调用
//通过ActivityManagerService来实现activity的启动
int result = ActivityManagerNative.getDefault()
.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) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
(其中ActivityManagerNative.getDefault()得到的是 IActivityManager)
在这个execStartActivity方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动时会调用一个 checkStartActivityResult方法, 如果没有在清单中配置这个组件,就会在这个方法中抛出异常。最后调用的是 Application.scheduleLaunchActivity() 进行启动activity, 而这个方法中会获取到一个 ActivityClientRecord 对象,而这个 ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity 组件使用 ActivityClientRecord来进行描述,而 ActivityClientRecord中会保存有一个 LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity组件。