前言:Workspace界面加载属于Launcher资源加载的一部分,总体来说,Workspace上的加载主要还是解析default_workspace.xml文件中定义的资源。Launcher启动后在Workspace界面和Hotseat上看到的默认显示的应用图标、小部件等都是在default_workspace.xml文件中定义的。本博文主要简单介绍涉及Workspace界面资源加载重要类和default_workspace.xml定义的资源。
一. Launcher加载工作中的重要类和接口实现
在分析Workspace界面加载资源前,我们先来看看涉及到Launcher资源加载流程的重要类之间的关系图,以及相关接口的功能实现说明。
纵观上面的类图,逐步分析每个类和接口扮演的角色:
Callbacks:在LauncherModel中定义的一个内部接口,该接口中声明了一些进行Launcher加载的函数。
LauncherModel:该类主要用于加载桌面图标、小部件、文件夹。同时LaucherModel是一个广播接收器,在程序包发生改变、区域、或者配置文件发生改变时,都会发送广播给LaucherModel,LaucherModel会根据不同的广播来做相应加载操作。
Launcher:Launcher模块的主Activity,实现Callbacks接口,Callbacks中的函数都在Launcher中实现,供LauncherModel中进行加载工作时进行回调。
接下来解析分析Callbacks接口中声明的函数在Launcher中的实现功能:
setLoadOnResume():由于Launcher继承自Activity,因此Launcher可能会处于paused状态(onPause()被调用),则有可能在这段时间内资源可能
发生了改变,如应用被删除或新应用安装,因此需要在onResume()中调用此方法进行重新加载。
getCurrentWorkspaceScreen():获取桌面(Workspace)当前屏幕页数。
startBinding():通知Launcher加载开始,并更新Workspace上的shortcuts。
bindItems(ArrayList<ItemInfo>shortcuts, int start, int end):以6个item为单位,批量处理item在workspace中的绑定(end-start = 6),如需要绑定在workspace中的item个数为15,则先处理6-0,,12-6个,再处理15-12个。绑定在workspace中的item的个数由default_workspace.xml文件中定义的item个数决定。
bindFolders(HashMap<Long,FolderInfo>folders):启动Launcher时,若桌面上一开始就有文件夹,则调用该方法绑定相关的数据。
finishBindingItems():完成相关资源的加载。
bindAppWidget(LauncherAppWidgetInfoinfo):将widget添加到workspace。
bindAllApplications(ArrayList<ApplicationInfo>apps):给菜单界面添加应用(系统所加载的每个应用都对应一个图标)
bindAppsAdded(ArrayList<ApplicationInfo>apps):单独安装一个第三方应用时执行该方法添加应用信息
bindAppsUpdated(ArrayList<ApplicationInfo>apps):应用本身升级安装替换时执行该方法。
bindAppsRemoved(ArrayList<ApplicationInfo>apps, boolean permanent):卸载应用时执行该方法
bindPackagesUpdated():多个应用程序包更新时执行该方法
isAllAppsVisible():判断当前是否为菜单界面,返回true,说明进入菜单界面。
bindSearchablesChanged():桌面搜索框更新时执行该方法。
二. default_workspace.xml文件介绍
Launcher中的default_workspace.xml文件在Launcher启动时,Workspace和Hotseat部分加载和显示资源时必须去解析的文件。下面我们来看看该文件的代码片段,如下:
<?xml version="1.0" encoding="utf-8"?>
<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher">
......
<favorite
launcher:packageName="com.android.camera"
launcher:className="com.android.camera.Camera"
launcher:screen="2"
launcher:x="0"
launcher:y="3" />
......
<appwidget
launcher:packageName="com.android.deskclock"
launcher:className="com.android.alarmclock.AnalogAppWidgetProvider"
launcher:screen="2"
launcher:x="1"
launcher:y="0"
launcher:spanX="2"
launcher:spanY="2" />
<!--folder of holding shortcut-->
<folder
launcher:title="@string/fx_app"
launcher:screen="2"
launcher:x="3"
launcher:y="3">
<favorite
launcher:packageName="com.android.calendar"
launcher:className="com.android.calendar.AllInOneActivity"
/>
......
</folder>
......
<!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
<favorite
launcher:packageName="com.android.contacts"
launcher:className="com.android.contacts.activities.DialtactsActivity"
launcher:container="-101"
launcher:screen="0"
launcher:x="0"
launcher:y="0" />
......
</favorites>
xml文件中的各个元素的定义介绍:
<favorites/>:定义Workspace和Hotseat中可加载的资源。其子元素 有<favorite/>、<appWidget/>、<folder/>。
<favorite/>:定义Workspace和Hotseat中加载显示的快捷方式(shortcut),该元素有如下属性:
packageName:快捷方式对应应用的包名;
className:快捷方式对应应用的类全名;
screen:该快捷方式的位置在Workspace界面的第几页数;
x:该快捷方式的位置在Workspace界面初始x轴值(默认情况为0-3,即Workspace横排方向可放四个快捷图标,一个快捷图标占用一个晶格);
y:该快捷方式的位置在Workspace界面初始y轴值(默认情况为0-3,即Workspace竖排方向可放四个快捷图标,一个快捷图标占用一个晶格);
container:定义快捷方式所在的界面类型(Workspace或Hotseat),container为-101时,说明该快捷方式在Hotseat界面。(Hotseat界面的快捷方式默认情况下x轴取值范围为0-3,y轴只能为0)。
<appWidget/>:定义Workspace界面加载显示的小部件,该元素有如下属性:
packageName:小部件对应应用的包名;
className:小部件对应应用的类全名;
screen:该小部件的位置在Workspace界面的第几页数;
x:该小部件的位置在Workspace界面初始x轴值;
y:该小部件的位置在Workspace界面初始y轴值;
spanX:小部件在x轴方向上扩展的倍数(小部件是可扩展的,一般扩展为单个晶格的倍数);
spanY:小部件在y轴方向上扩展的倍数。
<folder/>:定义Workspace或Hotseat界面加载显示的文件夹。
title:文件夹的名字;
x:该文件夹的位置在Workspace界面初始x轴值;
y:该文件夹的位置在Workspace界面初始y轴值;
screen:该小文件的位置在Workspace界面的第几页数;
ontainer:定义文件夹所在的界面类型;