Launcher3 中的 MVC 架构类解析
Launcher3 中的 MVC 架构类解析
一、模型层(Model)
模型层负责存储数据和处理业务逻辑,不依赖于视图层。
类名 | 功能描述 |
---|---|
BgDataModel | 维护 Launcher 的所有内存数据,提供数据增删改查方法 |
包含数据结构:itemsIdMap 、workspaceItems 、appWidgets 、collections | |
关键方法:addItem() 、removeItem() 、updateShortcutPinnedState() | |
ItemInfo 及其子类 | 表示 Launcher 中的各种项目(应用、快捷方式、小部件等) |
子类:AppInfo 、FolderInfo 、LauncherAppWidgetInfo 、WorkspaceItemInfo | |
WidgetsModel | 管理所有可用小部件的数据 |
ShortcutRequest | 处理深度快捷方式的查询和管理 |
二、视图层(View)
视图层负责展示数据和接收用户输入,通常是 Android 的 UI 组件。
类名 | 功能描述 |
---|---|
Workspace | 主屏幕工作区,显示和管理应用图标、文件夹和小部件 |
Hotseat | 底部固定栏,显示常用应用 |
AllAppsContainerView | 所有应用列表视图 |
Folder | 文件夹视图,管理和显示文件夹内的应用 |
LauncherAppWidgetHostView | 小部件的宿主视图 |
BubbleTextView | 应用图标的文本标签视图 |
三、控制器层(Controller)
控制器层处理用户交互,协调模型和视图之间的通信。
类名 | 功能描述 |
---|---|
LauncherModel | 核心控制器,负责加载数据、处理更新,并通知视图刷新 |
关键方法:startLoader() 、bindItems() 、bindScreens() | |
Launcher | 主 Activity,处理用户点击事件并调用模型操作 |
处理图标拖拽、文件夹创建等用户交互操作 | |
LoaderTask | 后台任务,负责从系统加载应用和小部件数据 |
InstallShortcutReceiver | 处理快捷方式安装请求的广播接收器 |
四、交互接口
为实现模型与视图的解耦,Launcher3 使用接口定义通信契约。
接口名 | 功能描述 |
---|---|
BgDataModel.Callbacks | 模型通知视图更新的回调接口,视图组件实现此接口以接收数据变更通知 |
包含方法:bindItems() 、bindScreens() 、bindDeepShortcutMap() 等 |
五、MVC 协作流程示例
以「添加应用到主屏幕」为例:
-
用户点击应用(视图层)
Workspace
或AllAppsContainerView
捕获点击事件 -
通知控制器(Launcher)
事件传递给Launcher
处理 -
控制器操作模型(LauncherModel)
Launcher
调用LauncherModel.addItemToDatabase()
添加应用 -
模型更新数据(BgDataModel)
BgDataModel
更新workspaceItems
和itemsIdMap
数据结构 -
模型通知视图(Callbacks)
通过Callbacks.bindItems()
接口通知视图刷新 -
视图更新UI(Workspace)
Workspace
接收通知后重绘界面显示新应用
六、架构设计优势
- 职责分离:数据管理、UI展示、逻辑控制独立维护,代码结构清晰
- 低耦合性:通过接口通信,模型与视图层解耦,便于独立扩展
- 可测试性:模型层可独立进行单元测试,不依赖UI组件
- 性能优化:后台数据加载与UI渲染分离,提升用户交互体验
- 多用户支持:模型设计包含
UserHandle
,天然支持多用户数据隔离