widget_fix_v4_summary.md 3.5 KB

桌面卡片无更新问题修复 V4

🔍 问题根本原因

从最新日志分析发现了真正的问题:

多进程问题

日志显示有多个不同的进程:

  • 9103-9103 - 卡片进程1
  • 8980-8980 - 主应用进程
  • 9738-9738 - 卡片进程2

关键发现:每个进程都有自己的 GlobalWidgetManager 实例!

问题表现

08-09 10:20:20.972   I   Heanup widget global listener received state update: isPlaying=true, widgets count: 

注意 widgets count: 后面是空的,说明 GlobalWidgetManager.getInstance().getActiveWidgetCount() 在某些进程中返回了 undefined

状态不同步

  • 进程A:注册了3个卡片,activeWidgets: 3
  • 进程B:接收到状态更新,但 activeWidgets: 0(因为是不同的GlobalWidgetManager实例)
  • 结果:全局监听器收到更新,但因为认为没有活跃卡片而跳过更新

🔧 修复方案 V4

1. 移除跨进程依赖

不再依赖 GlobalWidgetManager 的跨进程状态同步,每个进程只管理自己的卡片。

// 旧代码(有问题)
const activeWidgetCount = GlobalWidgetManager.getInstance().getActiveWidgetCount();
if (activeWidgetCount > 0) {
  this.updateAllWidgetsWithData(data);
}

// 新代码(修复)
hilog.info(0x0000, TAG, `Heanup widget global listener received state update: isPlaying=${data.playState.isPlaying}, process: ${process.pid}`);
// 总是尝试更新,让updateAllWidgetsWithData自己检查
this.updateAllWidgetsWithData(data);

2. 增强进程识别

添加进程ID到日志中,便于调试多进程问题:

hilog.info(0x0000, TAG, `Heanup widget updateAllWidgetsWithData called, active widgets: ${activeWidgets.size}, process: ${process.pid}`);

3. 简化逻辑

  • 移除全局状态检查的前置条件
  • 让每个进程的 updateAllWidgetsWithData 自己决定是否有卡片需要更新
  • 如果没有卡片,方法内部会直接返回,不会造成问题

🎯 预期效果

应该看到的改进:

  1. 每个进程都会尝试更新:不再因为跨进程状态不同步而跳过
  2. 正确的进程日志:可以看到哪个进程在处理更新
  3. 卡片正常更新:每个进程管理自己的卡片,不依赖其他进程

日志应该显示:

I   Heanup widget global listener received state update: isPlaying=true, process: 9738
I   Heanup widget updateAllWidgetsWithData called, active widgets: 1, process: 9738
I   Heanup widget 1952361985 calling formProvider.updateForm with isPlaying=true
I   Heanup widget 1952361985 updated successfully: isPlaying=true

🔄 架构改进

从全局单例到进程本地管理

  • 旧架构:试图在多进程间共享GlobalWidgetManager状态(不可行)
  • 新架构:每个进程管理自己的卡片,通过CommonEvent同步状态

工作流程

1. 主应用状态变化
2. 通过CommonEvent广播到所有进程
3. 每个卡片进程的全局监听器接收更新
4. 每个进程更新自己管理的卡片
5. 所有卡片都得到正确更新

🧪 测试要点

  1. 多进程测试:确认每个进程都能正确处理状态更新
  2. 卡片更新:确认所有卡片都能正确显示状态变化
  3. 日志完整性:确认看到完整的更新流程日志
  4. 性能测试:确认没有重复更新或性能问题

这个修复解决了多进程环境下的状态同步问题,让每个进程独立管理自己的卡片,避免了跨进程状态依赖的复杂性。