AppWidgetProvider如何获取传递给AppWidgetManager.updateAppWidget()的RemoteViews
updateAppWidget传递的RemoteViews问题 问题描述
负责应用微件的应用活动调用
AppWidgetManager.updateAppWidget(int appWidgetId, RemoteViews views)时,AppWidgetProvider的onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)方法会被触发。传递的
RemoteViews会如何处理?我见过的所有示例中,AppWidgetProvider都会自行构造RemoteViews。若我的AppWidgetProvider想要使用传递给updateAppWidget()的RemoteViews,该如何获取它?
核心结论
AppWidgetProvider的onUpdate方法无法直接获取你通过updateAppWidget传递的RemoteViews实例。系统调用onUpdate仅作为更新通知,不会将外部传入的RemoteViews透传给该回调。
可行实现方案
1. 通过Intent传递构造参数(推荐)
调用updateAppWidget时,不直接传入RemoteViews,而是将构造它所需的参数(文本内容、图片ID、布局ID等)通过Intent的Extra传递给AppWidgetProvider,在回调中解析参数后重新构造RemoteViews:
// 调用端代码 Intent updateIntent = new Intent(context, YourWidgetProvider.class); updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); updateIntent.putExtra("widget_text", "目标显示文本"); updateIntent.putExtra("widget_layout", R.layout.your_widget_layout); int[] targetWidgetIds = {yourAppWidgetId}; updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, targetWidgetIds); context.sendBroadcast(updateIntent); // AppWidgetProvider端代码 @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(intent.getAction())) { String text = intent.getStringExtra("widget_text"); int layoutId = intent.getIntExtra("widget_layout", R.layout.default_widget); int[] widgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); if (widgetIds != null) { AppWidgetManager widgetManager = AppWidgetManager.getInstance(context); for (int id : widgetIds) { RemoteViews views = new RemoteViews(context.getPackageName(), layoutId); views.setTextViewText(R.id.widget_text, text); widgetManager.updateAppWidget(id, views); } } } }
2. 内存缓存临时存储RemoteViews
若必须直接复用RemoteViews实例,可将其临时存入全局单例、Application类成员变量等内存缓存中:
- 调用
updateAppWidget前,先将RemoteViews存入缓存; - 在
AppWidgetProvider的onUpdate方法中从缓存取出使用。
⚠️ 注意:内存缓存会随进程回收失效,可靠性较低,仅适合临时场景。
补充说明
系统设计AppWidgetProvider的onUpdate回调,核心是让微件自身主导更新逻辑。外部调用updateAppWidget本质是触发更新通知,或直接将构造好的RemoteViews交给系统渲染,不会将实例透传给回调。因此优先选择传递参数、内部构造RemoteViews的方案。
内容的提问来源于stack exchange,提问作者Richard Parkins

