马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
AMS被SystemServer启动之后,SystemServer会通过AMS调用startHomeActivity启动Launcher. Launcher着实就是个Activity,学习Launcher的启动后,再去看Activity启动,会容易许多。
Launcher的启动分2个阶段:
第一阶段是startHomeActivity,触发activity的历程创建;
第二阶段就是AMS的attachApplication在历程创建后被调用,终极实行realStartActivityLocked会回调Activity的onCreate函数。
- class ActivityManagerService{
- public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
- ...
- mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
- ...
- }
- }
- class ActivityTaskManagerService{
- @Override
- public void resumeTopActivities(boolean scheduleIdle) {
- synchronized (mGlobalLock) {
- mRootWindowContainer.resumeFocusedTasksTopActivities();
- if (scheduleIdle) {
- mTaskSupervisor.scheduleIdle();
- }
- }
- }
- }
- class RootWindowContainer{
- boolean resumeFocusedTasksTopActivities(Task targetRootTask, ActivityRecord target, ActivityOptions targetOptions,boolean deferPause) {
-
- for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
- ...
- result |= resumedOnDisplay[0];
- if (!resumedOnDisplay[0]) {
- if (focusedRoot != null) {
- result |= focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);
- } else if (targetRootTask == null) {
- result |= resumeHomeActivity(null /* prev */, "no-focusable-task",
- display.getDefaultTaskDisplayArea());
- }
- }
- }
- }
- boolean startHomeOnTaskDisplayArea(int userId, String reason, TaskDisplayArea taskDisplayArea, boolean allowInstrumenting, boolean fromHomeKey) {
- Intent homeIntent = null;
- ActivityInfo aInfo = null;
- if (taskDisplayArea == getDefaultTaskDisplayArea()) {
- homeIntent = mService.getHomeIntent();
- aInfo = resolveHomeActivity(userId, homeIntent);
- } else if (shouldPlaceSecondaryHomeOnDisplayArea(taskDisplayArea)) {
- Pair<ActivityInfo, Intent> info = resolveSecondaryHomeActivity(userId, taskDisplayArea);
- aInfo = info.first;
- homeIntent = info.second;
- }
- if (aInfo == null || homeIntent == null) {
- return false;
- }
-
- if (!canStartHomeOnDisplayArea(aInfo, taskDisplayArea, allowInstrumenting)) {
- return false;
- }
-
- // Updates the home component of the intent.
- homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
- homeIntent.setFlags(homeIntent.getFlags() | FLAG_ACTIVITY_NEW_TASK);
- // Updates the extra information of the intent.
- if (fromHomeKey) {
- homeIntent.putExtra(WindowManagerPolicy.EXTRA_FROM_HOME_KEY, true);
- if (mWindowManager.getRecentsAnimationController() != null) {
- mWindowManager.getRecentsAnimationController().cancelAnimationForHomeStart();
- }
- }
- homeIntent.putExtra(WindowManagerPolicy.EXTRA_START_REASON, reason);
- // Update the reason for ANR debugging to verify if the user activity is the one that
- // actually launched.
- final String myReason = reason + ":" + userId + ":" + UserHandle.getUserId(aInfo.applicationInfo.uid) + ":" + taskDisplayArea.getDisplayId();
- mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);
- return true;
- }
- }
复制代码
在线源码:
1 Launcher
2 ActivityManagerService
|