Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动的,SystemServer组件首先是启动PackageManagerServic,由它来负责安装系统的应用程序,系统中的应用程序安装好了以后,SystemServer组件接下来就要通过ActivityManagerService来启动Home应用程序Launcher了,Launcher在启动的时候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就启动这些应用程序。
Launcher启动流程
启动Launcher时通过调用ActivityManagerService的systemReady函数实现的
frameworks/base/services/java/com/android/server/SystemServer.java
|
|
SystemServer.java中的startOtherServices方法中调用ActivityManagerService的systemReady函数。
|
|
systemReady方法会调用ActivityStackSupervisor.java的resumeFocusedStackTopActivityLocked方法
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
|
|
resumeFocusedStackTopActivityLocked会调用ActivityStack.java的resumeTopActivityUncheckedLocked方法,ActivityStack对象用于描述Activity堆栈。
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java
|
|
resumeTopActivityUncheckedLocked会调用resumeTopActivityInnerLocked方法
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java
|
|
resumeTopActivityInnerLocked方法调用ActivityStackSupervisor.java的resumeHomeStackTask方法
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
|
|
resumeHomeStackTask最后调用ActivityManagerService.java的startHomeActivityLocked函数
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
|
|
|
|
ActivityManagerService.java的startHomeActivityLocked方法最终完成Lanucher的启动
- 如何系统运行模式是低级工厂模式并且mTpoicAction为null,则退出方法,否则进行下面的处理
- 创建Intent,如果系统模式不是低级工厂模式,则将intent的Category设置为Intent.CATEGORY_HOME
- 判断符合Action为Intent.ACTION_MAIN,Category为Intent.CATEGORY_HOME的应用程序是否已经启动
- 如果没有启动则启动该应用程序,就是Launcher程序。
Launcher3的AndroidManifest.xml配置文件中的intent-filter匹配Action为android.intent.action.MAIN,Category为android.intent.category.HOME。如下所示
packages/apps/Launcher3/AndroidManifest.xml
|
|
Lanucher应用图标显示过程
Lanucher3继承Activity,所以它的运行从onCreate方法开始
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
|
|
- 获取LauncherAppState的实例app
- 调用app的setLauncher函数并将Lanucher对象传入
- LanucherModel调用startLoader开始加载数据
LauncherAppState的setLauncher函数如下
packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java
|
|
initialize函数中将callbacks封装成一个弱引用对象,这个mCallbacks对象就是传入的launcher对象,下面将会用到它。
接下来回到LauncherModel的startLoader函数
packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java
|
|
- 创建LoadTask对象
- 将LoadTask对象作为消息发送到HandlerThread处理,sWorkerThread是具有消息循环的线程HandlerThread对象,sWorker是一个Handler对象,并且传入了sWorkerThread的Looper,所以sWorker发送的消息将由sWorkerThread处理。
LoaderTask实现了Runnable接口,当它被处理时会调用run方法。
packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java
|
|
- loadAndBindWorkspace方法加载工作区信息
- loadAndBindAllApps方法加载系统以及安装的应用程序
loadAndBindAllApps方法的实现如下:
|
|
loadAllApps方法如下
|
|
callbacks对象事件上就是Launcher对象,callbacks.bindAllApplications就是调用Launcher的bindAllApplications方法。
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
|
|
packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java
|
|
|
|
onFinishInflate函数在加载完xml文件时就会调用,AllAppsRecyclerView将显示App列表,这样应用程序的图标就会显示在屏幕上。
Launcher应用图标点击过程
下面开始了解在Launcher上点击一个应用图标的过程。
Lanucher的xml布局文件会加载AllAppsContainerView这个控件如下:
packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java
|
|
- 获取Launcher的实例
- 创建AllAppsGridAdapter的实例,并传入Launcher对象
接下来看AllAppsGridAdapter,它是RecyclerView的Adapter,直接看它的onCreateViewHolder方法。
packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
|
|
- 实例化BubbleTextView就是Launcher上的应用程序图标控件
- BubbleTextView设置点击事件,mIconClickListener就是传入的Launcher对象,所有点击应用图标就会回调Launcher的onClick方法
- 给BubbleTextView设置tag为AppInfo
下面看Launcher.java的onClick方法:
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
|
|
当tag是AppInfo时调用startAppShortcutOrInfoActivity方法
|
|
startAppShortcutOrInfoActivity调用startActivitySafely来启动应用程序。
|
|