为什么手动触发更新的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,需确保配置Activity
NotePicker在用户完成配置后,返回结果时携带EXTRA_APPWIDGET_ID参数(值为当前配置的小组件ID),并调用setResult(RESULT_OK, intent)后再结束Activity,否则系统可能无法正常分发后续更新广播。 - 集合类的UpcomingWidget在
onUpdate()被触发后,需要额外调用appWidgetManager.notifyAppWidgetViewDataChanged(widgetId, R.id.你布局中集合控件的ID)刷新列表内容,否则集合数据不会更新。
内容的提问来源于stack exchange,提问作者user15876680
相关产品推荐
相关产品推荐

