前言
根据前几篇文章,咱们学习了Android系统发动流程相关的init进程、Zygote进程、SystemServer进程,这篇文章咱们将来学习Launcher发动过程。
咱们的android系统发动后,最终会显现在桌面界面,这个桌面便是咱们今天要讲的Launcher,它也是一个使用程序。Launcher发动后,它会去找PKMS拿系统里现已安装过的使用程序信息,然后把这些使用程序的方便图标一个个显现在系统屏幕上,这样咱们就能够经过点击这些方便图标来发动对应的使用。
Launcher发动过程介绍
在上一篇文章中提到过,在SystemServer里的run()办法中,会去调用startOtherServices()办法,去发动一些系统服务,在startOtherServices()办法里,咱们能够看到调用到了AMS的systemReady()办法,记住这个办法,发动Launcher的入口便是从这个办法开始的:
//代码文件方位:frmework/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() {
*****省掉部分代码*****
//记住这个systemReady()
mActivityManagerService.systemReady(() -> {
*****省掉部分代码*****
}
下面来查看下AMS的systemReady()办法做了什么:
//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityManagerService.java
public void systemReady(final Runnable goingCallback, BootTimingsTraceLog traceLog) {
*****省掉部分代码*****
mStackSupervisor.resumeFocusedStackTopActivityLocked();
*****省掉部分代码*****
}
systemReady办法里,调用了ActivityStackSupervisor的resumeFocusedStackTopActivityLocked办法:
//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
boolean resumeFocusedStackTopActivityLocked( ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
if (targetStack != null && isFocusedStack(targetStack)) {
return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
}
*****省掉部分代码*****
}
接着调用了ActivityStack的resumeTopActivityUncheckedLocked办法,ActivityStack目标是用来描绘Activity堆栈的,resumeTopActivityUncheckedLocked办法源码如下:
//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityStack.java
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
result = resumeTopActivityInnerLocked(prev, options);
*****省掉部分代码*****
}
接着看resumeTopActivityInnerLocked():
//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityStack.java
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
*****省掉部分代码*****
return isOnHomeDisplay() && mStackSupervisor.resumeHomeStackTask(prev, "prevFinished");
*****省掉部分代码*****
}
resumeTopActivityInnerLocked()里的代码非常多,咱们只分析最关键的一部分,调用了mStackSupervisor的resumeHomeStackTask办法,mStackSupervisor是一个ActivityStackSupervisor目标:
//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
boolean resumeHomeStackTask(ActivityRecord prev, String reason) {
*****省掉部分代码*****
return mService.startHomeActivityLocked(mCurrentUser, myReason);
}
这儿的mService指的是AMS,能够看到在这儿调用了AMS的startHomeActivityLocked办法:
//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityManagerService.java
boolean startHomeActivityLocked(int userId, String reason) {
*****省掉部分代码*****
//在这儿创立 Launcher发动所需的Intent
Intent intent = getHomeIntent();
*****省掉部分代码*****
//假如Launcher还没被创立的话
if (app == null || app.instr == null) {
//在这儿 发动Launcher
mActivityStarter.startHomeActivityLocked(intent, aInfo, myReason);
}
}
首先会去调用getHomeIntent()办法,去创立Launcher发动所需的Intent其间包含action设置为Intent.ACTION_MAIN,以及intent的Category设置为Intent.CATEGORY_HOME。
小知识点: 这儿为什么要设置
Intent.ACTION_MAIN和Intent.CATEGORY_HOME?其实咱们能够去看
Launcher的源码里,在它的AndroidManifest文件中,intent-filter标签就匹配了Action为Intent.ACTION_MAIN,Category为Intent.CATEGORY_HOME,这样咱们这个Launcher使用就可正常被找到并发动啦
创立完Launcher所需的Intent后,就判断假如Launcher没有发动的话,就会去调用mActivityStarter.startHomeActivityLocked()去发动Launcher:
//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityStarter.java
void startHomeActivityLocked(Intent intent, ActivityInfo aInfo, String reason) {
//讲Launcher放入HomeStack中
mSupervisor.moveHomeStackTaskToTop(reason);
//发动Launcher
mLastHomeActivityStartResult = startActivityLocked();
}
在startHomeActivityLocked()里,先把Launcher放入HomeStack中,HomeStack是在ActivityStackSupervisor中界说的,用来存储Launcher的变量,接着调用startActivityLocked()办法来发动Launcher。
调用startActivityLocked()办法后边的源码,就涉及到Activity的发动流程了,咱们后边会讲。
到此,最终就进入到Launcher的onCreate办法,Launcher发动完结。
时序图
系列文章
点击直达→→ 更多系统发动流程文章
有所收成的朋友,请多多关注、点赞,谢谢大家!

