widget_fix_v7_summary.md 3.8 KB

Widget Fix V7 - 解决EntryFormAbility未初始化问题

问题分析

从最新日志分析发现了关键问题:

1. EntryFormAbility生命周期问题

  • onAddForm未被调用:日志中没有看到 onAddForm called
  • 但onFormEvent正常工作:能看到 onFormEvent called 和用户交互
  • 服务未初始化:全局监听器没有被设置,导致widget无法更新

2. 数据流正常但UI不更新

  • CommonEvent接收正常CommonEvent received in form process
  • AvSession数据更新正常AvSession data received: isPlaying=true
  • 但缺少EntryFormAbility的全局监听器:没有看到 global listener received state update
  • 没有formProvider.updateForm调用:widget UI没有被更新

3. 可能的原因

  1. 卡片已存在:可能卡片之前已经创建,现在只是恢复,所以只调用onFormEvent而不调用onAddForm
  2. 初始化时机问题:服务初始化只在onAddForm中进行,但onAddForm可能不会每次都被调用
  3. 进程重启:form进程重启后,EntryFormAbility实例重新创建,但没有重新初始化

修复方案

1. 在多个生命周期方法中确保初始化

文件: entry/src/main/ets/entryformability/EntryFormAbility.ets

// 在onUpdateForm中添加初始化检查
onUpdateForm(formId: string): void {
  if (!this.globalListenerSetup) {
    this.initializeServices();
  }
  // ... 其他逻辑
}

// 在onFormEvent中添加初始化检查
onFormEvent(formId: string, message: string): void {
  if (!this.globalListenerSetup) {
    this.initializeServices();
  }
  // ... 其他逻辑
}

2. 移除PlayerControlService中的冗余AvSession注册

文件: entry/src/main/ets/common/widget/PlayerControlService.ets

// 简化AvSession监听器初始化,避免重复注册
private initializeAvSessionListener(): void {
  // 不要在这里注册,让EntryFormAbility直接注册到AvSessionWidgetListener
  hilog.info(0x0000, TAG, 'AvSession listener initialized successfully (no direct registration needed)');
}

3. 增强日志调试

添加更详细的日志来跟踪:

  • EntryFormAbility的所有生命周期方法调用
  • 服务初始化状态
  • 全局监听器的注册和触发

预期修复效果

1. 确保服务初始化

  • 无论通过哪个生命周期方法进入,都能确保服务被正确初始化
  • 全局监听器能够正确注册到AvSessionWidgetListener

2. 恢复widget更新

  • EntryFormAbility的全局监听器能够接收到状态变化
  • updateAllWidgetsWithData 方法能够被正确调用
  • formProvider.updateForm 能够更新widget UI

3. 数据流完整性

完整的数据流应该是:

  1. 主应用 → 发送CommonEvent
  2. Form进程 → PlayerControlService接收CommonEvent
  3. PlayerControlService → 更新AvSessionWidgetListener数据
  4. AvSessionWidgetListener → 通知EntryFormAbility全局监听器
  5. EntryFormAbility → 调用updateAllWidgetsWithData
  6. FormProvider → 更新widget UI

测试要点

  1. 生命周期测试

    • 重新添加widget,检查onAddForm是否被调用
    • 点击widget按钮,检查onFormEvent是否正确初始化服务
    • 检查onUpdateForm是否能正确处理未初始化状态
  2. 数据流测试

    • 检查是否能看到 Heanup EntryFormAbility global listener received state update
    • 检查是否能看到 formProvider.updateForm 调用
    • 验证widget UI是否正确更新
  3. 日志监控

    • Heanup EntryFormAbility services not initialized, initializing now...
    • Heanup EntryFormAbility global listener received state update
    • Heanup widget 1450551168 calling formProvider.updateForm

这个修复应该能解决widget无法更新的核心问题,确保EntryFormAbility在任何情况下都能正确初始化并接收状态更新。