You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么手动触发更新的Android AppWidgets无法正常执行更新操作?

问题根因

你的手动更新方法refreshWidgets()中传递小组件ID列表使用的Extra键错误:系统接收ACTION_APPWIDGET_UPDATE广播时,识别小组件ID数组的固定键为AppWidgetManager.EXTRA_APPWIDGET_IDS(末尾带S),你当前使用的是单实例场景的EXTRA_APPWIDGET_ID,系统无法识别到传入的小组件ID,因此不会触发对应Provider的onUpdate()回调。

修复方案

修改refreshWidgets()中传递Extra的两行代码即可:

fun refreshWidgets(context: Context) {
    val manager = AppWidgetManager.getInstance(context)
    val noteIntent = Intent(context, NoteWidget::class.java)
    val upcomingIntent = Intent(context, UpcomingWidget::class.java)
    noteIntent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
    upcomingIntent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
    val noteIds = manager.getAppWidgetIds(ComponentName(context, NoteWidget::class.java))
    val upcomingIds = manager.getAppWidgetIds(ComponentName(context, UpcomingWidget::class.java))

    // 此处修改为EXTRA_APPWIDGET_IDS
    noteIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, noteIds)
    upcomingIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, upcomingIds)
    context.sendBroadcast(noteIntent)
    context.sendBroadcast(upcomingIntent)
}

额外注意事项

  • 你两个小组件的provider配置中updatePeriodMillis均设置为0,因此系统不会触发周期性自动更新,所有更新都需要手动调用逻辑触发,如果你需要系统自动更新,可将该值设置为不小于1800000(30分钟)的整数,系统会以对应周期自动触发onUpdate()。
  • 带配置页的NoteWidget,需确保配置ActivityNotePicker在用户完成配置后,返回结果时携带EXTRA_APPWIDGET_ID参数(值为当前配置的小组件ID),并调用setResult(RESULT_OK, intent)后再结束Activity,否则系统可能无法正常分发后续更新广播。
  • 集合类的UpcomingWidget在onUpdate()被触发后,需要额外调用appWidgetManager.notifyAppWidgetViewDataChanged(widgetId, R.id.你布局中集合控件的ID)刷新列表内容,否则集合数据不会更新。

内容的提问来源于stack exchange,提问作者user15876680

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 09:57:03