我有几个小部件,基本上是我应用程序中功能的快速链接,
这些小部件基本上都是ListView / GridViews,它们在主应用程序执行期间发生变化的数据支持。
由于数据仅在应用程序执行期间更改,因此更新频率设置为:
android:updatePeriodMillis="0"
并且在更改的数据上,我触发了以下内容:
public void updateWidget(@SuppressWarnings("rawtypes") Class provider) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
int[] gridids = appWidgetManager.getAppWidgetIds(new ComponentName(this.getPackageName(), provider.getName()));
Intent intent = new Intent(this, provider);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,gridids);
sendBroadcast(intent);
}
我能够在提供商的onReceive()
和他们的调用更新机制中发现这一点:
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.e(this.getClass().getSimpleName(), "onReceive()");
int[] ids = intent.getExtras().getIntArray("appWidgetIds");
for(int id : ids) onUpdateWithService(context, id);
}
protected void onUpdateWithService(Context context, int widgetId) {
super.onUpdateWithService(context, widgetId);
RemoteViews views = new RemoteViews(context.getPackageName(), getResourceLayout(context, widgetId));
Intent intent = new Intent(context, GridViewWidgetServiceAdapter.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
views.setRemoteAdapter(R.id.listView, intent);
views.setPendingIntentTemplate(R.id.listView, PendingIntent.getActivity(context, -1, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT));
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(widgetId, views);
}
我遇到的问题是虽然代码触发并且updateAppWidget()
被调用,但小部件的UI不会改变。
我是否错过了Widget更新中涉及的技巧?
答案 0 :(得分:3)
This answer似乎解决了这个问题。
不确定为什么它可以解决问题,但它确实......
将以下行添加到intent中可以正常工作
Intent intent = new Intent(context, GridViewWidgetServiceAdapter.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
intent.putExtra("Random", Math.random() * 1000); // Add a random integer to stop the Intent being ignored.
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));