前言
根据前几篇文章,咱们学习了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发动完结
。
时序图
系列文章
点击直达→→ 更多系统发动流程文章
有所收成的朋友,请多多关注、点赞,谢谢大家!