2

我有几个小部件,它们基本上是我应用程序中功能的快速链接,

这些小部件基本上是 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()Provider 和他们的调用更新机制中捕捉到这一点:

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 更新中的一个技巧吗?

4

1 回答 1

3

这个答案似乎解决了这个问题。

不知道为什么它可以解决问题,但它确实......

将以下行添加到意图中工作正常

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)));
于 2013-08-12T10:14:11.397 回答