public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock{
public int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
return mActivityTaskManager.startActivity(caller, callingPackage, null, intent,
resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions);
}
}
我们可以看到调用了 mActivityTaskManager.startActivity,参数中IApplicationThread 我们留到后面讲。我们先往下追踪
ActivityTaskManagerService.java{
return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}
UserHandle.getCallingUserId()是获取当前的调用userId我们留到后面讲,当前我们继续追踪。
public int startActivityAsUser(IApplicationThread caller, String callingPackage,
String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
Bundle bOptions, int userId) {
return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
true /*validateIncomingUser*/);//最后一个参数设置了固定值true
}
private int startActivityAsUser(IApplicationThread caller, String callingPackage,
1179 @Nullable String callingFeatureId, Intent intent, String resolvedType,
1180 IBinder resultTo, String resultWho, int requestCode, int startFlags,
1181 ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
1182 assertPackageMatchesCallingUid(callingPackage);//判断当前调用packagename和调
//用uid是否匹配。留后面讲,这
//里不细究
1183 enforceNotIsolatedCaller("startActivityAsUser");//判断当前调用userid是否在合
//理沙箱合理范围内
1184 //验证用户userid/callingpid/callinguid
1185 userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
1186 Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
1187
1188 // 利用ActivityStarter工厂模式创建ActivityStarter
1189 return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
1190 .setCaller(caller)
1191 .setCallingPackage(callingPackage)
1192 .setCallingFeatureId(callingFeatureId)
1193 .setResolvedType(resolvedType)
1194 .setResultTo(resultTo)
1195 .setResultWho(resultWho)
1196 .setRequestCode(requestCode)
1197 .setStartFlags(startFlags)
1198 .setProfilerInfo(profilerInfo)
1199 .setActivityOptions(bOptions)
1200 .setUserId(userId)
1201 .execute();//执行execute
1202
1203 }
我们看看execute都执行了什么
int execute() {
try {
if (mRequest.intent != null && mRequest.intent.hasFileDescriptors()) {
throw new IllegalArgumentException("File descriptors passed in Intent");
}
final LaunchingState launchingState;
synchronized (mService.mGlobalLock) {
final ActivityRecord caller = ActivityRecord.forTokenLocked(mRequest.resultTo);
final int callingUid = mRequest.realCallingUid == Request.DEFAULT_REAL_CALLING_UID
? Binder.getCallingUid() : mRequest.realCallingUid;
launchingState = mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(
mRequest.intent, caller, callingUid);
}
if (mRequest.activityInfo == null) {
mRequest.resolveActivity(mSupervisor);
}
if (mRequest.intent != null) {
String intentAction = mRequest.intent.getAction();
String callingPackage = mRequest.callingPackage;
if (intentAction != null && callingPackage != null
&& (Intent.ACTION_REQUEST_SHUTDOWN.equals(intentAction)
|| Intent.ACTION_SHUTDOWN.equals(intentAction)
|| Intent.ACTION_REBOOT.equals(intentAction))) {
ShutdownCheckPoints.recordCheckPoint(intentAction, callingPackage, null);
}
}
int res;
synchronized (mService.mGlobalLock) {
final boolean globalConfigWillChange = mRequest.globalConfig != null
&& mService.getGlobalConfiguration().diff(mRequest.globalConfig) != 0;
final Task rootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
if (rootTask != null) {
rootTask.mConfigWillChange = globalConfigWillChange;
}
ProtoLog.v(WM_DEBUG_CONFIGURATION, "Starting activity when config "
+ "will change = %b", globalConfigWillChange);
final long origId = Binder.clearCallingIdentity();
res = resolveToHeavyWeightSwitcherIfNeeded();
if (res != START_SUCCESS) {
return res;
}
res = executeRequest(mRequest);
Binder.restoreCallingIdentity(origId);
if (globalConfigWillChange) {
mService.mAmInternal.enforceCallingPermission(
android.Manifest.permission.CHANGE_CONFIGURATION,
"updateConfiguration()");
if (rootTask != null) {
rootTask.mConfigWillChange = false;
}
ProtoLog.v(WM_DEBUG_CONFIGURATION,
"Updating to new configuration after starting activity.");
mService.updateConfigurationLocked(mRequest.globalConfig, null, false);
}
final ActivityOptions originalOptions = mRequest.activityOptions != null
? mRequest.activityOptions.getOriginalOptions() : null;
final boolean newActivityCreated = mStartActivity == mLastStartActivityRecord;
mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(launchingState, res,
newActivityCreated, mLastStartActivityRecord, originalOptions);
if (mRequest.waitResult != null) {
mRequest.waitResult.result = res;
res = waitResultIfNeeded(mRequest.waitResult, mLastStartActivityRecord,
launchingState);
}
return getExternalResult(res);
}
} finally {
onExecutionComplete();
}
}
1、