startActivityLocked 源码分析
时间: 2024-05-14 08:19:12 浏览: 59
activiti 源码分析
`startActivityLocked` 方法是 Android 系统中一个非常重要的方法,它在 ActivityManagerService 类中实现,用于启动一个 Activity。下面我们来分析一下它的源码。
先看一下 `startActivityLocked` 方法的签名:
```
final void startActivityLocked(IApplicationThread caller, Intent intent,
String resolvedType, ActivityInfo aInfo, IBinder resultTo, String resultWho,
int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions)
```
参数说明:
- `caller`:启动 Activity 的应用程序线程。
- `intent`:启动 Activity 的 Intent。
- `resolvedType`:Intent 的类型。
- `aInfo`:要启动的 Activity 的信息。
- `resultTo`:用于传递结果的 Binder 句柄。
- `resultWho`:用于传递结果的 Activity 名称。
- `requestCode`:请求码。
- `startFlags`:启动标记。
- `profilerInfo`:性能分析信息。
- `bOptions`:启动选项。
接下来,我们来看一下 `startActivityLocked` 的实现。
```
final void startActivityLocked(IApplicationThread caller, Intent intent,
String resolvedType, ActivityInfo aInfo, IBinder resultTo, String resultWho,
int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
// 1. 构造 ActivityRecord 对象
ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPid,
intent, resolvedType, aInfo, mService.getGlobalConfiguration(), resultRecord,
resultWho, requestCode, componentSpecified, voiceSession != null, this, sourceRecord);
// ...
// 2. 检查是否需要新建任务
boolean newTask = false;
boolean keepCurTransition = false;
boolean avoidMoveToFront = false;
if (r.packageName != null) {
if (mService.getRecentTasks().isInRecents(r)) {
// ...
} else if ((startFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) !=
0 || aInfo.targetActivity == null) {
// ...
} else {
// ...
}
}
// ...
// 3. 启动 Activity
ActivityStack stack = mService.getFocusedStack();
if (stack != null && (stack.mResumedActivity == null
|| !stack.mResumedActivity.nowVisible
|| stack.mResumedActivity.mTaskOverlay)) {
// ...
} else {
// ...
}
// ...
}
```
在实现中,首先会构造一个 ActivityRecord 对象,该对象代表要启动的 Activity。然后,会检查是否需要新建任务,如果需要,则会创建一个新的任务,并将 ActivityRecord 添加到该任务中。最后,会选择一个栈来启动 Activity。
总的来说,`startActivityLocked` 的实现比较复杂,其中涉及到很多细节和判断,但它的核心思想就是创建 ActivityRecord 对象,并将其添加到栈中,然后启动 Activity。
阅读全文