赞
踩
前言
由于源码分析的代码量比较大,大部分博客网站的内容显示页面都比较窄,显示出来的效果都异常丑陋,所以您也可以直接查看 《 Thinking in Android 》 来阅读这边文章,希望这篇文章能帮你梳理清楚 “Launcher 启动流程”。
核心源码
关键类
路径
SystemServer.java
frameworks/base/services/java/com/android/server/SystemServer.java
ActivityManagerService.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
ActivityStack.java
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java
ActivityTaskManagerService.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
RootActivityContainer.java
frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.java
Launcher.java
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
LauncherModel.java
packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java
LauncherAppState.java
packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java
LoaderTask.java
packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java
一、Launcher 启动流程
Android 系统启动的最后一步是启动一个 Home 应用程序,这个应用程序用来显示系统中已经安装的应用程序,我们称呼这个应用程序为 Launcher。
应用程序 Launcher 在启动过程中会请求 PackageManagerService 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个 快捷图标 列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序了。
1.1 SystemServer.startOtherServices()
// frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
private ActivityManagerService mActivityManagerService;
private void startOtherServices() {
... ...
mActivityManagerService.systemReady(() -> { // 调用 ActivityManagerService 的 systemReady() 方法
Slog.i(TAG, "Making services ready");
... ...
}
... ...
}
}
在 startOtherServices() 方法中,会调用 ActivityManagerService 的 systemReady() 方法。
1.2 ActivityManagerService.systemReady()
// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
@VisibleForTesting
public ActivityTaskManagerInternal mAtmInternal;
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
... ...
synchronized (this) {
... ...
// 调用 resumeTopActivities() 方法,这是一个抽象方法
mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
mUserController.sendUserSwitchBroadcasts(-1, currentUserId);
... ...
}
... ...
}
}
1.3 ActivityTaskManagerService.resumeTopActivities()
resumeTopActivities() 方法由 ActivityTaskManagerService 的内部类 LocalService 实现。
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
RootActivityContainer mRootActivityContainer;
final class LocalService extends ActivityTaskManagerInternal {
... ...
@Override
public void resumeTopActivities(boolean scheduleIdle) {
synchronized (mGlobalLock) {
// 调用 RootActivityContainer 的 resumeFocusedStacksTopActivities() 方法
mRootActivityContainer.resumeFocusedStacksTopActivities();
if (scheduleIdle) {
mStackSupervisor.scheduleIdleLocked();
}
}
}
... ...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。