https://blog.youkuaiyun.com/csdn_of_coder/article/details/78024696
1.Activity向AMS 发起请求启动App
1.1 AMS 启动Activity 流程
AMS 调用startActivity() 来启动APP:
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());
}
AMS.startActivity() ---> AMS.startActivityAsUser():
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle options, int userId) {
// 如果是膈应的应用,不允许打开其他app的activity
enforceNotIsolatedCaller("startActivity");
userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
false, ALLOW_FULL_ONLY, "startActivity", null);
return mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
profilerInfo, null, null, options, false, userId, null, null);
}
AMS.startActivityAsUser() ---> ActivityStackSupervisor.startActivityMayWait()
final int startActivityMayWait(
IApplicationThread caller,//AMS通过这个参数可以和发起者进行交互
int callingUid,//发起者uid
String callingPackage,//发起者包名
Intent intent, // 启动activity的intent
String resolvedType, // intent的类型,也就是MIME type
IVoiceInteractionSession voiceSession,
IVoiceInteractor voiceInteractor,
IBinder resultTo,//用于接收startActivityForResult的结果,launcher启动app这种情景下没有用,为null
String resultWho,
int requestCode,//这个是调用者来定义其意义,若值大于等于0,则AMS内部保存该值并通过onActivityResult返回调用者,这里为-1
int startFlags,// 传入的为0
ProfilerInfo profilerInfo,
WaitResult outResult,
Configuration config,
Bundle options,
boolean ignoreTargetSecurity,
int userId,
IActivityContainer iContainer, // 传入的为null
TaskRecord inTask)/ // 传入为null
{
... ...
//创建一个新的intent,方便后面进行改变
intent = new Intent(intent);
//创建保存activity 信息的activityInfo 对象
ActivityInfo aInfo =resolveActivity(intent, resolvedType, startFlags, profilerInfo, userId);
... ...
int res = startActivityLocked(caller, intent, resolvedType, aInfo,
voiceSession, voiceInteractor, resultTo, resultWho,
requestCode, callingPid, callingUid, callingPackage,
realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity,
componentSpecified, null, container, inTask);
... ...
if (outResult != null) {
... ...
mService.wait(); //等待应用进程的activity启动完成
... ...
}
... ...
if (res == ActivityManager.START_SUCCESS) {
... ...
mService.wait();
... ...
} else if (res == ActivityManager.START_TASK_TO_FRONT) {
if (r.nowVisible && r.state == RESUMED) {
} else {
mService.wait();
}
}
}
ActivityStackSupervisor.startActivityMayWait 调用ActivityStackSupervisor.resolveActivity 获取需要启动的activity 所属的pkg信息。
ctivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
ProfilerInfo profilerInfo, int userId) {
// Collect information about the target of the Intent.
ActivityInfo aInfo;
try {
ResolveInfo rInfo =
AppGlobals.getPackageManager().resolveIntent(
intent, resolvedType,PackageManager.MATCH_DEFAULT_ONLY|
ActivityManagerService.STOCK_PM_FLAGS, userId);
aInfo = rInfo != null ? rInfo.activityInfo : null;
} catch (RemoteException e) {
aInfo = null;
}
... ...
return aInfo;
}
startActivityAsUser() 的主要目的是进行权限检查,检查是否被隔离,是的话,不允许调用别的app的activity。
startActivityMayWait()方法主要是利用传进去的intent去向PKMS 获取需要 启动的app 的信息,存储在aIndo 中。
ActivityStackSupervisor.resolveActivity --->ActivityStackSupervisor.startActivityLocked
final int startActivityLocked(IApplicationThread caller,
Intent intent, String resolvedType, ActivityInfo aInfo,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
IBinder resultTo, String resultWho, int requestCode,
int callingPid, int callingUid, String callingPackage,
int realCallingPid, int realCallingUid, int startFlags, Bundle options,
boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,
ActivityContainer container, TaskRecord inTask) {
int err = ActivityManager.START_SUCCESS;
//调用进程对应的ProcessRecord实例,这里是Launcher进程
ProcessRecord callerApp = null;
... ...
ActivityRecord sourceRecord = null; //指向Launcher组件的一个ActivityRecord实例,它作为source端
ActivityRecord resultRecord = null;
... ...
//根据之前得到的一些信息,创建一个代表将要启动的Activity的ActivityRecord对象
ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho,
requestCode, componentSpecified, voiceSession != null, this, container, options);
... ...
try {
mService.mWindowManager.deferSurfaceLayout();
//继续调用startActivityUnchecked();doResume为true
err = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor, startFlags,true, options, inTask);
} finally {
mService.mWindowManager.continueSurfaceLayout();
}
}
获取此Activity 的信息,初始化为一个 ActivityRecord对象,它代表了当前需要启动的Activity在AMS中的存在形式。
继续调用startActivityUnchecked 函数