Laucher源码解析

一、布局概述

image.png

image.png

Launcher的布局结构如上图,最外层是一个DragLayer,其中包含Workspace也是最重要的控件,再里面是CellLayout,一个Workspace包含多个CellLayour,左右滑屏其实就是滑动多个CellLayour,下面是PageIndicator,滑动圆点显示,最下面是Hotseat,也就是滑动屏幕一直不动的几个应用。

二、流程概述

Launcher展示的时候,在左右滑动的桌面上(CellLayout)总会有默认呆在屏幕的几个app。在res下的xml里面包含这样三个文件:default_workspace_4x4、default_workspace_5x5、default_workspace_6x6,三个文件其实差不多,了解其中一个就好,以4x4为例

image.png

下面是4x4的布局,包含之前提到过的hotseat,后面单独说下这个布局,先来看resolve,其中包含的属性有screen,表示app呆在第几屏上,xy表示所在位置,箭头所指就是此app的属性,这样就可以把某个app放在相应的位置上了。

image.png

接下来看下hotseat,和default_workspace_4x4差不多,需要关注的是container这个属性,-101代表hotseat,因为只有一行,所以y值始终是0。

image.png

下面梳理整体流程,Launcher.java的onCreat(),初始化LauncherAppState、手机固件信息、拖拽管理工具,设置并加载布局,经过一系列初始化工作后,开始加载应用数据(调用LauncherMode的startLoader)。

image.png

重点看下加载数据,也就是LauncherMode(继承BroadcastReceiver)中的startLoader,开启线程任务,关注LoaderTask(实际上是Runnable)中的run方法就可以

image.png

run方法主要做了两件事,先加载并绑定workspace,再加载绑定所有的应用,这里的所有应用指的是“点击唤起所有应用按钮后的第二层界面”(详见下图)

image.png
image.png
image.png

先来看下loadAndBindWorkSpace,代码很清晰,先load后bind,

image.png

loadWorkspace做的事情较多,需要拆解来看下重点部分。

(1)首先是调用loadDefaultFavoritesIfNecessary解析xml并存储到数据库,由于代码调用层级较多,所以这里用文字来描述更加清晰,关键类AutoInstallsLayout,首先初始化这个类,然后调用mOpenHelper.loadFavorites这个类,在loadFavorites又调用AutoInstallsLayout的loadLayout,接着parseLayout解析xmlparseAndAddLoad来解析所有属性,其中包含位置信息(x、y),屏幕(screen),container等,如果解析到了include,则直接解析include包含的xml,将解析完成后的所有值存储到数据库中,待之后使用。

image.png

(2)接着从数据库中获取数据,若系统中包含此应用,则放到指定map中,若不包含则在数据库中删除此条数据。由于代码较多,为了描述更加清晰,代码有所删减,只留下重点部分

image.png

再来看bindWorkspace,逻辑比较清晰,将存在于workspace和hotset的app分类放到list里,调用bindWorkspaceItems绑定当前屏幕的workspace的app、hotset的app、文件夹,之后再绑定其他屏的workspace的app、hotset的app、文件夹。

到这里加载绑定WorkSpace的app(loadAndBindWorkspace)整体流程缕完了,下面是加载绑定第二屏的所有应用的流程梳理。

首先通过getActivityList获取所有应用,然后从中循环获取应用信息。然后调用loadAndBindWidgetsAndShortcuts加载绑定widget和快捷方式,接着调用updateWidgetsModel,把widget和快捷方式信息都放置到WidgetsModel中,供后续使用。

image.png

你可能感兴趣的:(Laucher源码解析)