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,天然支持多用户数据隔离