前言

根据前几篇文章,咱们学习了Android系统发动流程相关的init进程Zygote进程SystemServer进程,这篇文章咱们将来学习Launcher发动过程

咱们的android系统发动后,最终会显现在桌面界面,这个桌面便是咱们今天要讲的Launcher,它也是一个使用程序Launcher发动后,它会去找PKMS拿系统里现已安装过的使用程序信息,然后把这些使用程序的方便图标一个个显现在系统屏幕上,这样咱们就能够经过点击这些方便图标来发动对应的使用。

Launcher发动过程介绍

在上一篇文章中提到过,在SystemServer里的run()办法中,会去调用startOtherServices()办法,去发动一些系统服务,在startOtherServices()办法里,咱们能够看到调用到了AMSsystemReady()办法,记住这个办法,发动Launcher的入口便是从这个办法开始的:

//代码文件方位:frmework/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() { 
    *****省掉部分代码*****
    //记住这个systemReady()
    mActivityManagerService.systemReady(() -> { 
    *****省掉部分代码*****
}

下面来查看下AMSsystemReady()办法做了什么:

//代码文件方位:frmework/base/services/core/java/com/android/server/am/ActivityManagerService.java
public void systemReady(final Runnable goingCallback, BootTimingsTraceLog traceLog) {
    *****省掉部分代码*****
    mStackSupervisor.resumeFocusedStackTopActivityLocked();
    *****省掉部分代码*****
}

systemReady办法里,调用了ActivityStackSupervisorresumeFocusedStackTopActivityLocked办法:

//代码文件方位: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); 
        }
    *****省掉部分代码*****
}

接着调用了ActivityStackresumeTopActivityUncheckedLocked办法,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()里的代码非常多,咱们只分析最关键的一部分,调用了mStackSupervisorresumeHomeStackTask办法,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,能够看到在这儿调用了AMSstartHomeActivityLocked办法:

//代码文件方位: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,以及intentCategory设置为Intent.CATEGORY_HOME

小知识点: 这儿为什么要设置Intent.ACTION_MAINIntent.CATEGORY_HOME

其实咱们能够去看Launcher的源码里,在它的AndroidManifest文件中,intent-filter标签就匹配了ActionIntent.ACTION_MAINCategoryIntent.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的发动流程了,咱们后边会讲。

到此,最终就进入到LauncheronCreate办法,Launcher发动完结

时序图

系统启动流程(六)之Launcher启动过程

系列文章

点击直达→→ 更多系统发动流程文章

有所收成的朋友,请多多关注、点赞,谢谢大家!