代码总体架构
项目比较简单,全都采用适配器模式+单例模式搞定。
TopView自不必说,只有三个按钮。以侧边栏为例,层级架构图如下:
关键类
入口类
SidebarService
onestep的后台服务类,整个程序入口在此。有两个地方触发该服务的启动,一个是系统层监听到左、右上角的滑动事件,一个是用户在桌面点击onestep图标进入设置界面。SidebarController
SidebarService启动后,第一件事就是调用SidebarController.init(),把UI、后台数据类等启动起来。
不要被后缀Controller给骗了,它根本不是MVC模式中的Controller类,它就是一个控制onestep的UI的总管罢了。
主要功能:处理onestep模式的进入、退出事件,整体UI的显示、隐藏、侧边栏模式的顶层控制处理。
UI类
顶部栏
- TopView
顶层栏视图容器类,继承自FrameLayout,容纳三个图标按钮,即最近图片、文档、剪贴板。
功能:显示三个最近XX的图标按钮,处理它们的点击事件,带动画效果。
侧边栏
SidebarRootView
侧边栏根布局视图类,继承FrameLayout,容纳所有侧边栏视图内容
功能:主要处理侧边栏图标长按拖动效果的顶层处理,包括显示流程逻辑、动画、触摸事件SideView
侧边栏显示列表内容的类,列表内容主要有三种,联系人,应用图标,分享组件图标,且还有几种是辅助拖拽效果的。
分两层显示,每层用一个DragScrollView承载,里面放SidebarListView视图组件,SidebarListView才是真正放图标的地方。
功能一:接受系统拖拽目标的放置,动画、触摸事件的顶层处理,然后调起相应的应用,把信息发过去,类型有文字、图片等
功能二:设置、退出两个功能图标按钮
DragScrollView
继承自ScrollView,容纳列表视图,主要处理触摸事件,同时支持拖动与滚动的功能。SidebarListView
侧边栏里的列表类,继承ListView,真正容纳图标的地方
功能:显示图标列表,动画,图标长按事件监听与处理,拖拽事件转发给SidebarAdapter的具体子类处理
内容列表视图
- ContentView
内容视图总容器,继承自RelativeLayout,主要用来承载三个最近XXX内容列表,显隐、切换。当然,还有Back键和触摸处理。
RoundCornerFrameLayout
内容视图列表面板视图类,继承FrameLayout,主要提供圆角矩形的面板效果
它有四个具体子类,实际只用到三个,恰好是我们看到的三个最近xxx的面板
ClipboardViewGroup:最近剪贴板
RecentFileViewGroup:最近文件
RecentPhotoViewGroup:最近图片
BookmarkViewGroup:未使用RecentPhotoViewGroup
最近图片列表视图容器类,继承自RoundCornerFrameLayout,内部容纳了一个ListView,用来承载最近图片的条目,视图数据来自RecentPhotoAdapterRecentFileViewGroup
类上,只是数据适配器,用了RecentFileAdapterClipboardViewGroup
类上,只是数据适配器,用了ClipboardAdapterBookmarkViewGroup
实际未使用
- PhotoLineSubView, RecentFileItemView, ClipboardItemView
具体视图条目类,它们均为最近xxx面板视图的具体条目,三类面板,对应三类条目,内部逻辑都是负责条目的视图显示、点击与长按事件处理。
设置界面相关
略
适配器类
- SidebarAdapter
侧边栏列表适配器抽象类,继承BaseAdapter
提供视图数据自不必说,数据来自其成员变量,数据层的各种XXXManager类单例。
关键是定义了拖拽事件的中转接口,子类必须实现来最终处理DragEvent。
它有四个具体子类,分别是:
AppListAdapter:应用列表适配器
ContactListAdapter:联系人列表适配器
OngoingAdapter:暂未分析
ResolveInfoListAdapter:分享应用组件列表适配器
- RecentPhotoAdapter,RecentFileAdapter,ClipboardAdapter
按名称分别对应上述RecentXXXXGroup的列表视图适配器类,继承自BaseAdapter,提供条目视图及绑定数据。
视图数据类
- SidebarItem
侧边栏条目视图的抽象描述类,定义了一些共同操作接口函数,如获取名称、图标、处理拖拽事件等。
它有四个直接子类,
AppItem,应用图标,只用于直接点击打开应用,不支持拖拽分享。
ContactItem,联系人图标,支持拖拽分享。具体有四种联系人,对应四个子类,见图。
OngoingItem,略。
ResolveInfoGroup,支持分享应用组件,拖拽分享的主要目标。
数据层相关类
- DataManager
数据管理抽象类,定义了数据更新监听器接口,当有数据更新时,通知XXXAdapter适配器,然后更新到UI。
因为数据层,即XXXManager类,有自己的工作子线程,数据操作是异步的,数据变动完毕后,通过这些监听接口,通知到视图层。
它有几个主要的子类,基本上一看名字就知道,它是为哪个对应的Adapter提供数据的。
这些xxxManager都是单例类,提供全局的数据访问。
侧边栏相关的是:
AppManager,ContactManager, OngoingManager, ResolveInfoManager
(ResolveInfoManager实际并未继承DataManager,但内部架构逻辑其实与其它三个一致,实际应该继承,获得统一的架构逻辑)
内容视图相关的是:
RecentPhotoManager,RecentFileManager,RecentClipManager
事件类
PackagesMonitor
应用包信息更新监视类,继承自BroadcastReceiver,广播接收,当有应用包信息更新时,比如新安装了应用,就会收到广播消息,然后通知数据层相关数据管理类更新数据。ShortcutReceiver
桌面Shortcut变动通知,继承自BroadcastReceiver