从详细的日志分析中发现了真正的问题:
initializeServices 或 setupGlobalStateListener 没有被正确调用GlobalWidgetManager.registerWidget 没有成功关键发现:卡片点击时使用的是缓存的旧状态,而不是实时状态!
从日志序列可以看出:
1. 用户点击播放按钮
2. 卡片调用 getCurrentPlayState() → 返回缓存的旧状态 (isPlaying=false)
3. 卡片立即更新显示 isPlaying=false
4. 主应用异步处理命令,真实状态变为 isPlaying=true
5. CommonEvent 广播真实状态 isPlaying=true
6. 但卡片已经显示了相反的状态
private initializeServices(): void {
hilog.info(0x0000, TAG, 'Heanup widget initializeServices called');
if (!this.widgetDataManager) {
this.widgetDataManager = new WidgetDataManager();
hilog.info(0x0000, TAG, 'WidgetDataManager initialized');
}
hilog.info(0x0000, TAG, `Heanup widget checking global listener setup: ${EntryFormAbility.globalListenerSetup}`);
if (!EntryFormAbility.globalListenerSetup) {
hilog.info(0x0000, TAG, 'Heanup widget setting up global listener...');
this.setupGlobalStateListener();
EntryFormAbility.globalListenerSetup = true;
hilog.info(0x0000, TAG, 'Heanup widget global listener setup flag set to true');
} else {
hilog.info(0x0000, TAG, 'Heanup widget global listener already setup, skipping');
}
}
onAddForm(want: Want): formBindingData.FormBindingData {
hilog.info(0x0000, TAG, 'onAddForm called');
// 初始化服务
try {
this.initializeServices();
hilog.info(0x0000, TAG, 'Services initialized successfully');
} catch (error) {
hilog.error(0x0000, TAG, `Failed to initialize services: ${error}`);
}
// 卡片注册
try {
this.globalWidgetManager.registerWidget(formId, widgetSize);
hilog.info(0x0000, TAG, `Widget registered successfully: ${formId}, size: ${widgetSize}`);
} catch (error) {
hilog.error(0x0000, TAG, `Failed to register widget: ${error}`);
}
}
关键修复:移除立即状态更新,等待真实状态通过CommonEvent到达
// 旧逻辑(错误)
// 处理完命令后立即更新当前卡片状态
await this.updateWidgetData(formId); // ❌ 使用缓存的旧状态
// 新逻辑(正确)
// 不要立即更新卡片,等待真实状态通过CommonEvent到达
// 真实状态会通过全局监听器自动更新所有卡片
hilog.info(0x0000, TAG, `Widget event processed, waiting for real state update via CommonEvent`);
"Heanup widget initializeServices called""WidgetDataManager initialized""Heanup widget setting up global listener...""Heanup widget global state listener setup successfully""Widget registered successfully: [formId], size: [size]""Heanup widget global listener received state update: isPlaying=[correct_state]""active widgets: [correct_count]" (不再是0)1. 用户点击卡片按钮
2. 发送控制命令到主应用
3. 主应用处理命令,更新真实播放状态
4. 主应用通过CommonEvent广播新状态
5. 全局监听器接收到新状态
6. 全局监听器更新所有活跃卡片
7. 卡片显示正确的新状态
这个修复应该彻底解决状态相反的问题,让卡片显示与实际播放状态完全一致。