activity启动流程分析
1.相关代码文件路径:
\frameworks\base\core\java\android\app\ContextImpl.java
\frameworks\base\core\java\android\app\ActivityThread.java
\frameworks\base\core\java\android\app\Instrumentation.java
\frameworks\base\core\java\android\app\ActivityManager.java
\frameworks\base\services\core\java\com\android\server\am\ActivityStartController.java
\frameworks\base\services\core\java\com\android\server\am\ActivityStarter.java
\frameworks\base\core\java\android\app\ClientTransactionHandler.java
\frameworks\base\core\java\android\app\servertransaction\ClientTransaction.java
\frameworks\base\core\java\android\app\servertransaction\LaunchActivityItem.java
\frameworks\base\core\java\android\app\servertransaction\ResumeActivityItem.java
2.流程图如下:
1.1.contentImpl部分:
StartActivity中检查了flag合理性,后进入到Instrumentation中:
@Override
public void startActivity(Intent intent, Bundle options) {
//系统用户拉起activity没有指定user会打印警告信息
warnIfCallingFromSystemProcess();
final int targetSdkVersion = getApplicationInfo().targetSdkVersion;
//必须添加FLAG_ACTIVITY_NEW_TASK
if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
&& (targetSdkVersion < Build.VERSION_CODES.N
|| targetSdkVersion >= Build.VERSION_CODES.P)
&& (options == null
|| ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
+ " Is this really what you want?");
}
//进入instrumentation
mMainThread.getInstrumentation().execStartActivity(
getOuterContext(), mMainThread.getApplicationThread(), null,
(Activity) null, intent, -1, options);
}
1.2 Instrumentation部分
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
Uri referrer = target != null ? target.onProvideReferrer() : null;
if (referrer != null) {
intent.putExtra(Intent.EXTRA_REFERRER, referrer);
}
//省略mActivityMonitors处理,未见其初始化与向列表中插入数据调用
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
//进入远程服务拉起activity
int result = ActivityManager.getService()
.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;
}
1.3 ActivityManager 部分
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
1.4 ActivityManagerService 部分
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
Inten