后屏投影:整体架构
本篇是知识库的顶层视图:后屏投影功能的分层架构、类职责划分、模块关系。
一、分层架构
后屏投影功能横跨四个层次,严格遵循「信号 → 业务 → UI」的单向依赖:
flowchart TB subgraph L4["UI 层 (settingsBaseUi)"] direction LR ITAB["ImageTabPreference<br/>BaseImageTabPreference"] TAB["CarUiTabLayout.Tab"] TIV["ThemeItemView"] SWITCH["MiCarNewSwitchPreference"] end subgraph L3["业务层"] direction LR BASE["BaseVehicleImageTabPreferenceController<br/>(模板骨架)"] MODE["RearProjectionModeTabController<br/>(模式Tab)"] LOCK["RearProjectionChildLockController<br/>(童锁)"] CPP["CarPropertyMgrPreferenceController<br/>(信号管理基类)"] end subgraph L2["信号层 (settingsBaseLib)"] direction LR SCPM["SettingsCarPropertyManager<br/>过滤/缓存/超时"] CPCM["CarPropertyCacheManager<br/>全局缓存+分发"] VCM["VehicleControlManager"] UTIL["VehiclePropertyUtil"] IDS["MiCarPropertyIds / Peripheral"] end subgraph L1["系统层"] AOSP["AOSP CarPropertyManager"] CAR["车端 CAN 总线"] end MODE --> BASE BASE --> CPP LOCK --> CPP CPP --> SCPM SCPM --> VCM --> CPCM --> AOSP --> CAR MODE -.驱动.-> ITAB ITAB --> TIV LOCK -.驱动.-> SWITCH BASE --> TAB
二、类职责一览
| 层 | 类 | 职责 | 详见 |
|---|---|---|---|
| 业务 | RearProjectionModeTabController | 模式 Tab:信号↔Tab 翻译、异常处理 | 05-核心类拆解/01 |
| 业务 | RearProjectionChildLockController | 童锁开关 | 05-核心类拆解/02 |
| 业务 | BaseVehicleImageTabPreferenceController | Tab 信号驱动模板骨架 | 05-核心类拆解/03 |
| 业务 | CarPropertyMgrPreferenceController | 信号管理、回弹忽略、回退 | 05-核心类拆解/04 |
| 信号 | SettingsCarPropertyManager | 过滤/缓存/超时监控 | 04-全链路 + docs/SettingsCarPropertyManager源码解析 |
| 信号 | CarPropertyCacheManager | 全局回调分发+缓存(启动耗时点) | 同上 |
| 信号 | VehiclePropertyUtil | isPropertyAvailable/getIntPropertyValue/toHexId | 07-异常态 |
| 信号 | MiCarPropertyIds / Peripheral | 信号 ID + 枚举常量 | 03-信号体系 |
| UI | ImageTabPreference / BaseImageTabPreference | Tab 数组渲染 | 06-UI与Tab体系 |
| UI | CarUiTabLayout.Tab | Tab 数据结构(三态+视觉资源) | 06-UI与Tab体系 |
| UI | ThemeItemView | 单个 Tab 项 View(灰/亮/转圈) | 06-UI与Tab体系 |
三、后排投影分组的两个并列 Controller
后屏投影在 XML 里是一个 MiCarPreferenceCategory,下面挂两个并列 Controller:
flowchart LR CAT["MiCarPreferenceCategory<br/>后排投影"] --> MODE["ImageTabPreference<br/>投影模式 Tab"] CAT --> LOCK["MiCarNewSwitchPreference<br/>童锁开关"] MODE -.controller.-> CMODE["RearProjectionModeTabController"] LOCK -.controller.-> CLOCK["RearProjectionChildLockController"]
- 模式 Tab(
RearProjectionModeTabController):本知识库主线,「收起/投影/屏风模式」三态切换。 - 童锁(
RearProjectionChildLockController):开关型,锁定后排投影控制。它和模式 Tab 共享信号层基础设施(CarPropertyMgrPreferenceController/SettingsCarPropertyManager),但业务上相对独立。
整个分组受
MiCarSettings.isProjectorEnable()控制,非投影车型不显示(见08-页面入口与资源)。
四、核心设计模式
4.1 模板方法(Template Method)
BaseVehicleImageTabPreferenceController 定义骨架,RearProjectionModeTabController 填空 4 个抽象方法 + 若干钩子。这是整个车控设置项的通用范式,详见 docs/02-核心架构-PreferenceController范式.md。
4.2 上下行信号分离(本功能特色)
读取状态用 PROJECTION_SCREEN_STATUS(8 值),下发命令用 SCREEN_CONTROL_COMMAND(3 值),不共用一个信号。详见 05-核心类拆解/01 §3。
4.3 数据驱动 UI(Tab 三态)
UI 不自己维护状态,完全由 Tab 的三个布尔字段(isAvailable/mIsSelected/isProcessing)驱动渲染。Controller 只改数据 + notifyDataChanged(),View 自动刷新。详见 06-UI与Tab体系。
4.4 全局缓存 + 多实例分发
CarPropertyCacheManager 是全局单例,一份车端回调可分发到多个 SettingsCarPropertyManager 实例(多个 Controller 共享同一信号),并缓存最新值供即时读取。详见 docs/SettingsCarPropertyManager源码解析。
五、与 docs 既有文档的关系
flowchart LR A["本知识库:后屏投影<br/>(业务专题)"] --> B["docs/02-PreferenceController范式<br/>(通用范式)"] A --> C["docs/05-车辆接口层与IPC<br/>(信号层)"] A --> D["docs/SettingsCarPropertyManager源码解析<br/>(信号管理深度)"] A --> E["docs/座舱车门知识库<br/>(同类业务参考)"]
本知识库是业务专题(后排投影),聚焦本功能的信号体系与交互;通用的 Controller 范式、信号层 IPC 机制请参考 docs 顶层编号文档。