引言
编写目的
预期的读者和阅读建议
读者分类
阅读重点
备注
系统工程师(负责软件需求开发)
协作说明
无
系统工程师(负责同层次相关系统的概要设计)
设计原理
无
系统工程师(负责构件的概要设计)
构架说明、协作说明、构件说明、接口说明
无
软件工程师(负责构件的详细设计)
构架说明、协作说明、构件说明、接口说明
无
测试工程师
构架说明、协作说明、接口说明
无
文档约定
无
术语、定义和缩略语
术语、定义
缩略语
缩略语
英语全称
中文全称
设计依据
表 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进行处理,非常感谢!