当前项目已经具备基础播放控制抽象:
MusicPlaybackController 负责统一播放动作入口。PlaybackCoordinator 负责将控制动作转发到实际播放运行时。PlaybackStateBridge 已经维护当前歌曲、队列、索引、播放状态、进度与时长。但项目中还没有音乐卡片能力,entry/src/main/module.json5 也尚未声明 form 类型扩展能力。
参考实现里有两条路线:
KDVideo:单一音乐播放卡片体系,使用 FormExtensionAbility + preferences 持久化快照 + updateForm 主动更新。musicCard 官方样例:多类型卡片平台,使用数据库维护卡片实例,并承载播放、歌词、推荐等多类卡片。结合当前项目结构与近期播放器控制收敛方向,首版音乐卡片应优先复用 KDVideo 的轻量链路,而不是引入官方样例那种重型卡片平台。
新增 3 种音乐卡片:
完成标准:
非目标:
做法:
FormExtensionAbility。preferences 保存快照和 formId 列表。updateForm。优点:
缺点:
做法:
LocalMusic 页面内部字段和生命周期。优点:
缺点:
LocalMusic 生命周期变化或后续继续拆播放器,卡片很容易失效。做法:
musicCard 样例建设数据库、统一工具类、多类卡片管理框架。优点:
缺点:
采用方案一,即“轻量单链路卡片方案”。
核心原则:
MusicPlaybackController。FormExtensionAbility 完成。LocalMusic 页面生命周期。新增 MusicCardFormAbility,负责:
onAddForm 时返回初始卡片数据。onUpdateForm 时按最新快照刷新卡片。onFormEvent 时处理卡片发回的动作。onRemoveForm 时清理失效 formId。新增统一卡片管理器,负责:
它是卡片层的唯一更新入口。
使用 preferences 持久化卡片快照,保证:
使用 preferences 保存 formId 列表,负责:
PlaybackStateBridge 继续承担基础播放状态桥接职责:
currentSongcurrentQueuecurrentQueueIndexisPlayingpositionMsdurationMsLocalMusic 仍然负责真实播放过程中的状态推进和歌词解析,但它不直接成为卡片宿主。
卡片侧通过 MusicCardManager 从现有播放状态中派生专用显示数据。
建议新增以下文件:
entry/src/main/ets/entryformability/MusicCardFormAbility.etsentry/src/main/ets/common/player/MusicCardConstants.etsentry/src/main/ets/common/player/MusicCardSnapshotStore.etsentry/src/main/ets/common/player/MusicCardFormStore.etsentry/src/main/ets/common/player/MusicCardManager.etsentry/src/main/ets/common/player/MusicCardSnapshot.etsentry/src/main/ets/widget/pages/MusicPlayerWidgetCard.etsentry/src/main/ets/widget/pages/MusicPlayerWidgetWideCard.etsentry/src/main/ets/widget/pages/MusicPlayerWidgetLyricCard.etsentry/src/main/resources/base/profile/form_config.json需要修改的现有文件:
entry/src/main/module.json5entry/src/main/ets/entryability/EntryAbility.etsentry/src/main/ets/view/LocalMusic.ets建议新增一份专门的卡片快照,不直接暴露播放器内部所有字段。
建议字段:
titleartistcoverPathhasCoverImageisPlayinghasSongcurrentPositionMsdurationMscurrentTimeTextdurationTimeTextlyricLine1lyricLine2hasLyricplayTypefilePathupdatedAtMs字段原则:
定位:
展示内容:
交互:
说明:
定位:
展示内容:
交互:
说明:
定位:
展示内容:
歌词规则:
说明:
歌词卡片是本方案最容易引发频繁刷新的部分,必须节流。
推荐策略:
LocalMusic 在现有链路里持续推进。LocalMusic 在推进进度后,调用 MusicCardManager 的节流更新入口。MusicCardManager 基于当前歌曲和当前进度,解析出“当前行 + 下一行”。updateForm。建议节流频率:
这样可以兼顾显示及时性和系统开销。
封面优先级:
建议复用现有封面能力:
CoverThumbCachepixelMapPath 或相关封面字段首版原则:
三种卡片统一使用一套动作常量。
建议动作:
play_pauseprev_songnext_songopen_playersync_register建议参数:
formIdactionsource协议规则:
postCardAction(call) 回到应用。postCardAction(router) 或统一路由动作打开播放器。sync_register 用于卡片出现时补登记 formId,避免首次添加或恢复后 formId 丢失。推荐链路:
postCardActionEntryAbility 接收 call 事件EntryAbility 解析动作EntryAbility 调用 MusicPlaybackControllerPlaybackStateBridgeMusicCardManager 刷新所有卡片主体点击链路:
open_playerEntryAbility 设置打开播放器所需状态或触发既有事件需要新增一个 extensionAbilities 节点:
MusicCardFormAbilityform$profile:form_config需要声明 3 个 form:
建议都设置为动态卡片,关闭定时更新,走主动刷新:
isDynamic: trueupdateEnabled: false原因:
需要增加:
open_player 路由处理需要增加:
MusicCardManager不建议增加:
LocalMusic 自己维护 formId 列表目标:
FormExtensionAbilityform_config.json验收:
目标:
验收:
目标:
验收:
目标:
验收:
风险:
updateForm 调用过于频繁,影响性能和稳定性。应对:
风险:
应对:
风险:
应对:
MusicCardManager 构建的统一快照。风险:
LocalMusic 多处,后续维护成本会很高。应对:
notifyPlaybackCardStateChanged()。首版应重点做真机冒烟验证。
必须验证:
本项目的音乐卡片应采用“KDVideo 轻量链路 + 当前项目播放控制抽象”的组合方案:
LocalMusic 页面生命周期这样既能尽快落地普通卡、中等卡、歌词卡,又能与当前播放器解耦方向保持一致,避免后续返工。