Android-Launcher启动过程

867 阅读3分钟

系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序,这个应用程序就叫做Launcher。Launcher在启动过程中会请求PackageManagerService返回系统已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表,显示在屏幕上。用户可以通过这些图标启动应用程序。

Launcher也就是Android的系统桌面,用于启动应用程序和管理应用程序的快捷图标或者其他桌面组件。

Launcher启动流程

1624200596224.jpg

启动Launcher的入口为AMS的systemReady方法。在SystemServer的startOtherServices方法中被调用。

在systemReady方法中调用了ActivityStackSupervisor的resumeFocusedStackTopActivityLocked方法,接着调用ActivityStack的resumeTopActivityUncheckedLocked方法。ActivityStack用来描述Activity堆栈的。最后一直各种调用,到了AMS的startHomeActivityLocked方法。

在startHomeActivityLocked方法中会去判断运行模式和Acticity的Action的值。系统的运行模式分为三种,分别是非工厂模式,低级工厂模式和高级工厂模式。Action的默认值为Intent.ACTION_MAIN。这里就是判断一下运行模式是否为低级工厂模式,并且Action为null,如果都满足,直接return false。

然后调用getHomeIntent方法创建Launcher需要的Intent。在getHomeIntent方法中会去创建一个Intent,并将Action传入,判断系统是否运行模式是否为低级工厂模式,如果不是则将intent的Category设置为Intent.CATEGORY_HOME,然后返回这个Intent。

接着会判断Action为Intent.ACTION_MAIN并且Category为Intent.CATEGORY_HOME的应用程序是否启动。如果没有启动,则会调用ActivityStarter的startHomeActivityLocked方法来启动Launcher。

在startHomeActivityLocked方法中会将Launcher放入HomeStack中,HomeStack是在ActivityStackSupervisor中定义的用于储存Launcher的变量。接着调用startActivityLocked方法来启动Launcher。到这里,Launcher就启动完成了。

Launcher应用图标显示过程

Launcher启动后会有很多工作,这里我们先从Laucher的onCreate方法入手。

会在onCreate方法中获取LauncherAppState实例,调用它的setLauncher方法将Launcher对象传入。在setLauncher方法中会将传入的Launcher实例封装成弱引用。

然后会调用LauncherModel的startLoader方法。在这个方法中创建一个HandlerThread和Handler,并将HandlerThread的Looper传入这个Handler。这个Handler的作用就是给HandlerThread发消息。然后创建一个LoaderTask并用过Handler传给HandlerThread。

LoaderTask实现了Runnable接口,当LoaderTask描述的消息被处理时,就会调用run方法。LoaderTask是LauncherModel的内部类。

Launcher是用工作区的形式来显示应用程序的。每一个工作区用来描述一个抽象桌面,它由n个屏幕组成,每个屏幕又分为n个单元格,每个单元格用来显示一个应用程序图标。

在run方法中会调用loadWorkspace和bingdWorkSpace方法来加载和绑定工作区信息。然后调用loadAllApps方法来加载系统已经安装的应用信息。最后是调用到了Launcher的bindAllApplications方法。

在方法中会调用AllAppsContainerView类型的mAppsView的setApps方法,将包含应用信息的列表apps传入。在内部会将apps设置给mApps,mApps是AlphabeticalAppsList(按字母顺序排列app的集合)类型的对象。最后方法会走到AllAppsContainerView的onFinishInflate方法。这个方法会在AllAppsContainerView加载完XML布局时调用,在onFinishInflate方法中获取到mAppsRecyclerView,将mApps设置进去,并设置好adapter,这样应用程序就会显示在屏幕上。

到这里Launcher的整个流程也就完了。