Launcher软件系统设计方案

引言

编写目的

预期的读者和阅读建议

读者分类

阅读重点

备注

系统工程师(负责软件需求开发)

协作说明

系统工程师(负责同层次相关系统的概要设计)

设计原理

系统工程师(负责构件的概要设计)

构架说明、协作说明、构件说明、接口说明

软件工程师(负责构件的详细设计)

构架说明、协作说明、构件说明、接口说明

测试工程师

构架说明、协作说明、接口说明

文档约定

术语、定义和缩略语

术语、定义

缩略语

缩略语

英语全称

中文全称

设计依据

表 3.1 涉及的文档

文件编

文件名称

版本

说明

系统概述

业务介绍

Launcher是开机后用户第一个使用的应用,它负责显示和管理手机上装载的应用。是手机操作系统的一个重要的组成部分。

业务背景

Launcher作为“最听话手机”软件系统的一个组成部分,需要和语音系统进行无缝对接,完成对用户语音操作的快速响应,并提供更好的用户体验。Launcher应用必须能够快速适应并引领用户的使用习惯,这样才能为我司的手机增添更多的光彩。

构架说明

页面布局逻辑

图1 页面布局逻辑

表1各个界面的描述说明

图层

描述

Draglayer

最外层的layer,负责在拖动事件的处理

qsb_bar

全局的搜索条

workspace

显示widget,shortcut,和folder,可容纳多个CellLayout

apps_customize_pane

显示所有的app,widget可容纳多个CustomizeCellLayout

overview_panel

底部的panel(壁纸,小部件,设置)

Clings

导引界面,有4个导引界面first_run_cling workspace_cling folder_cling cling_scrim

Drawable State Proxy View

搜索条上的话筒在使用的时候显示的界面

Page indicator

workspace页面的指示条

Hotseat

代表主屏幕下方的dock栏,可以放置4个快捷图标和一个进入AllApps的按钮

初始化流程

图2 初始化流程

数据加载流程

设计原理

系统构架的考虑

目前我们已经有原生的Launcher 3.0代码,已经MiLauncher的代码。新的launcher是在原生的Launcher3.0基础上进行开发。

采用的基本规则是:添加的新的模块需要放到新建立的包中,对原有组件的修改可以在原有的代码上进行操作。

关键技术的考虑

拖拽的实现

图3 拖拽的时序图

View事件的拦截机制

Launcher中的界面层次很多,在控制事件在各个View间进行传递时,用到的一个非常重要的技术是View的拦截机制。事件拦截机制配合Layout的分层的部署可以很好解决拖动视效在不同页面上的显示问题。

如图5所示,Draglayer在拖动动画显示的时候负责拖动效果的处理,workspace层负责屏幕的切换,CellLayout负责图标的绘制,图标负责点击后启动应用的响应。

图4 Android View的事件拦截机制

图5 拦截机制的应用

数据库

当前Launcher数据库中主要有两张表:Favourite 表用于存储应用的信息,包括图标,显示位置,使用频率等;workspaceScreens 表用于存储workspace中screen的信息,主要就是screen的显示顺序。

在Launcher中添加新的功能点的时候,免不了对这些表进行扩展。扩张可以通过两种方式进行:1.表扩展 ,用于对应用增加新的属性信息,直接在Favourite表中增加新的数据列就可以了;2.数据库扩展,为了支持新功能和新业务,例如T9搜索,天气预 等,这些独立的模块可以有自己独立的数据库。

这里先简单介绍一下目前的数据库设计方案。

表2 数据库表Favourite

列名

类型

描述

_id

INTEGER

主键,唯一标识

title

TEXT

标题

Intent

TEXT

启动应用的intent

container

INTEGER

应用所在的文件夹的_id(一定大于0),如果是hotseat值为-101,其他的值为-100

screen

INTEGER

Workspace中的_id

cellX

INTEGER

格的x坐标

cellY

INTEGER

格的y坐标

spanX

INTEGER

X坐标上占用的 格数

spanY

INTEGER

Y坐标上占用的 格数

itemType

INTEGER

类型(shortcut,application)

appWidgetId

INTEGER

Widget的id

isShortcut

INTEGER

是否是shortcut

iconType

INTEGER

ICON_TYPE_RESOURCE,ICON_TYPE_BITMAP

iconPackage

TEXT

如果iconType是ICON_TYPE_RESOURCE,则表示icon所在的package name

iconResource

TEXT

如果iconType是ICON_TYPE_RESOURCE,则表示icon所在资源的id

icon

BLOB

Icon的Bitmap的内容

uri

TEXT

存放应用的下载地址

displayMode

INTEGER

Folder的显示方式

appWidgetProvider

TEXT

widget provider的名称

modified

INTEGER

距离上一次访问的时间间隔

表3 数据库表workspaceScreens

列名

类型

描述

_id

INTEGER

主键,唯一标识

screenRank

INTEGER

Screen的顺序编

modified

INTEGER

距离上一次访问的时间间隔

屏幕层次的合并

目前Launcher3中将应用和应用的快捷方式分别放在两个层次上显示,业界的Launcher大多都已经将这两个层次进行了合并,如小米。在当前版本上将这两层合并为一层的可行方案如下:

去掉hotseat中进入all apps 的入口。

apps_customize_pane是用来容纳所有的应用和widget的。应用的显示可以移到workspace中,因此就不在显示到apps_customize_pane。

Launcher启动的时候解析出所有的应用,按照事先约定的策略将应用的信息写入到Favourite这张表中,该表中的isShortcut字段就不在有效。

在原有的数据加载流程中去掉对all apps 的数据加载。

修改workspace中删除应用快捷方式的功能为删除应用的功能。

当侦听到应用安装和删除后要及时修改Favourite表中的相关信息。

按照此方式修改该后,数据加载流程如下:

图6 新的数据加载流程

动画效果

复用性的考虑

Launcher是Android平台上的一个应用,能够达到在不同型 手机上的通用性。其次,Launcher中的一些小模块,可以以库的形式提供,如视效等,这样就可以在不同的应用上复用。

扩展性的考虑

在Launcher项目中可以扩展很多新的功能,扩展的方式有很多。

壁纸和主题的切换,可以通过添加新的Activity来实现。

天气预 ,实现动态桌面,动态内存显示,可以通过添加新的widget来实现。

T9搜索通过扩展图层来完成。

不同场景下的显示模式的切换(如儿童模式),可以通过增加策略文件,扩展应用的属性和数据过滤条件来完成。

可测试性的考虑

可通过monkey进行测试。

可靠性的考虑

性能方面的考虑

协作说明

在语音处理上,需要借助语音助手。通过语音助手来唤起Launcher中的处理流程。

构件说明

Launcher (Activity): main Activity,负责界面的切换。

LauncherModel :利用线程加载数据,加载完成后通知launcher显示刷新界面。负责接收广播事件,然后进行数据更新,通知界面刷新。

LauncherApplication:应用的实例,利用LauncherAppState进行数据库的初始化,注册广播的接收,例如应用的安装,删除,状态改变,搜索等。广播事件的接收是在LauncherModel中,它是真正的receiver。

LauncherProvider:数据库相关的provider,负责和数据库的接口工作。

Workspace: 是抽象的桌面的所有屏,其中的每一屏是一个CellLayout。管理和控制桌面的显示,包括添加和删除页面,显示预览效果,处理shourtcut和widget图标的显示位置,侦听拖动事件,滚动事件,并作出相应的处理。预览模式是worksapce的一种特殊的视效。

AppsCustomizePagedView:是all app界面包括app和widget两个部分,其中PagedViewCellLayout和PagedViewGridLayout.java分别用来存放app和widget。

AppsCustomizeTabHost:内嵌在AppsCustomizeTabHost中的组件,在当点击AllApp按钮是,会跳转到AppsCustomizeTabHost中。

DragLayer:继承自FrameLayout,是整个Launcher的根容器。当快捷图标或者AppWidget被拖拽时,事件的处理就在DragLayer进行操作的;

DragController:是DragLayer的controller;

Hotseat:Hotseat也是FrameLayout的直接子类,代表主屏幕下方的dock栏,可以放置4个快捷图标和一个进入AllApps的按钮。可由ODM定制,其点击、拖拽等操作一般也由Workspace.java完成

LauncherAppWidgetHost:继承自AppWidgetHost,它的作用就是帮助Launcher管理和创建AppWidget,并且能够捕获长按事件,使得应用可以正常的删除、添加

AppWidget。通过调用
mAppWidgetHost.startListening()方法,开启监听

AddAdapter:为setWallPaper提供adapter;

Alarm:提供定时操作,比如把快捷方式拖动到垃圾箱后让垃圾箱消失再回复到原有的桌面;

AllAppsList:保存所有的app信息;

AppWidgetResizeFrame:用来改变拖拽到桌面上的widget的大小;

BubbleTextView:是每个桌面上快捷方式的text;

Cling:是第一次使用android手机的帮助手指;

DeferredHandler:是配合LauncherModel.java来进行更新的操作;

DragScroller:用于左右划屏;

DragSource:被拖拽的源;

DropTarget:计算是否可以被放下;

Folder:打开文件夹用于显示的类;

FolderIcon:文件夹未打开显示在桌面上的图标;

FolderEditText:文件夹的名字;

FolderInfo:文件夹的信息类,同样继承自ItemInfo.java;

IconCache:icon缓存类,用于提高效率;

InstallShortcutReceiver:apk安装的receiveer类;

InstallWidgetReceiver:widget安装的receiveer类;

ItemInfo:launcher中所有信息的父类;

PagedView:实现翻页操作的抽象父类,有翻页效果的类都需要继承自它;

PendingAddItemInfo:是all app中所有widget的信息类;

SearchDropTargetBar:search bar;


SpringLoadedDragController:是把app从all app拖拽到桌面上的整个桌面显示的缩略图,方便用户查看;

Utilities:放置一些公共方法;

接口说明

无。

参考文献

无。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年9月4日
下一篇 2021年9月4日

相关推荐