Activity工作原理
APP启动原理
在手机屏幕上点击某个APP的图标,比如淘宝APP,此时,整个手机屏幕就是一个“巨型APP”,而这个Activity所在的APP,也就是Launcher。也因此Launcher和我们点击的淘宝APP是属两个不同的APP,它们位于不同的进程中,其双方的通信是通过 Binder 完成的,此时AMS就是担负两者通信的桥梁。以启动淘宝APP为例,分析整体启动流程:
Launcher启动后会将已安装的应用程序的快捷图标显示到桌面上,这些应用程序的快捷图标就是启动根Activity的入口,当点击应用程序的快捷图标时,就会调用Launcher的startActivitySafely方法,继而经由 Activity —> Instrumentation —> IActivityManager —> AMS(实现了IActivityManager.Stub就可以进行跨进程通信)【Android 11.0源码新增ActivityTaskManagerService】
在 Instrumentation#execStartActivity 中
int result = ActivityTaskManager.getService().startActivity(whoThread, who.getBasePackageName(), who.getAttributionTag(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
|
在 ATMS 中
@Override public final int startActivity(IApplicationThread caller, String callingPackage, String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) { return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, UserHandle.getCallingUserId()); }
private int startActivityAsUser(IApplicationThread caller, String callingPackage, @Nullable String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) { assertPackageMatchesCallingUid(callingPackage); enforceNotIsolatedCaller("startActivityAsUser");
userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser, Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
return getActivityStartController().obtainStarter(intent, "startActivityAsUser") .setCaller(caller) .setCallingPackage(callingPackage) .setCallingFeatureId(callingFeatureId) .setResolvedType(resolvedType) .setResultTo(resultTo) .setResultWho(resultWho) .setRequestCode(requestCode) .setStartFlags(startFlags) .setProfilerInfo(profilerInfo) .setActivityOptions(bOptions) .setUserId(userId) .execute();
}
|
在 ActivityStarter#execute 中
int execute() {
res = executeRequest(mRequest);
return getExternalResult(mRequest.waitResult == null ? res : waitForResult(res, mLastStartActivityRecord)); }
private int executeRequest(Request request) {
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession, request.voiceInteractor, startFlags, true , checkedOptions, inTask, restrictedBgActivity, intentGrants);
return mLastStartActivityResult; }
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, boolean restrictedBgActivity, NeededUriGrants intentGrants) { int result = START_CANCELED; final ActivityStack startedActivityStack; try { mService.deferWindowLayout(); result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor, startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants); } finally { startedActivityStack = handleStartResult(r, result); mService.continueWindowLayout(); }
postStartActivityProcessing(r, result, startedActivityStack);
return result; }
int startActivityInner() { computeLaunchingTaskFlags(); computeSourceStack(); mIntent.setFlags(mLaunchFlags);
final ActivityRecord targetTaskTop = newTask ? null : targetTask.getTopNonFinishingActivity(); }
|
- AMS进程到ApplicationThread的调用