Activity 启动调用流程 (基于5.0源码)
我们从 startActivity 开始:
startActivity()
startActivity()方法有多个重载,但是都会调用到 startActivityResult:
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
... //
}
...// 省略大量代码
}
Ok,我们可以看到 调用到了 Instrumentation 的 execStartActivity 方法。
下面我们看一下 execStartActivity
中的两行重点代码:
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);
可以看到,调用到了 ActivityManagerNative.getDefault() 的 startActivity。 而getDefault()返回的是一个 IActivityManager.
checkStartActivityResult()是校验activity 的启动结果的,比如我们没有在androidManifest 注册,等等。就会抛出异常。
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};
可以看到是一个单例。IActivityManager 是一个 Binder 接口
public interface IActivityManager extends IInterface {
...// 方法
}
而该Binder 的真正实现 是 ActivityManagerService(简称 AMS) 。 所以接下来我们来看 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 options) {
return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
resultWho, requestCode, startFlags, profilerInfo, options,
UserHandle.getCallingUserId());
}
啥实事也没干,直接转调了 startActivityAsUser
继续跟进,
@Override
public