是否有可能以编程方式抛出APPWIDGET_UPDATE的意图?

时间:2010-08-25 20:59:10

标签: android

希望我的窗口小部件中的按钮触发窗口小部件类上的APPWIDGET_UPDATE意图以强制更新,但我没有看到APPWIDGET_UPDATE是Intent中的静态字段。

这是可能的吗?如何做到这一点?

Intent intent = new Intent(context, BaseWidgetProvider.class);
intent.setAction({APPWIDGET_UPDATE INTENT HERE})
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

views.setOnClickPendingIntent(R.id.MyWidgetButton, pendingIntent);

2 个答案:

答案 0 :(得分:15)

,这是可能的。您可以在AppWidgetManager中找到该操作:

  

intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE)

编辑:您需要提供要更新的小部件的ID。以下是完整的样本。

AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
ComponentName widgetComponent = new ComponentName(context, YourWidget.class);
int[] widgetIds = widgetManager.getAppWidgetIds(widgetComponent);
Intent update = new Intent();
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
context.sendBroadcast(update);

答案 1 :(得分:2)

我知道这是一个非常古老的问题,但我认为这可能很有趣,因为Android更新了AppWidgets刷新政策。我认为这种改变可能会阻止现有的答案按预期工作。

这是我的解决方案,使用RemoteViews和集合。

public static final String ACTION_WIDGET_UPDATE = "com.yourpackage.widget.ACTION_UPDATE";

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_WIDGET_UPDATE)) {
        int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0);
        AppWidgetManager.getInstance(context)
                .notifyAppWidgetViewDataChanged(widgetId, R.id.widgetColectionRoot);
    }
    super.onReceive(context, intent);
}

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                     int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    for (int widgetId : appWidgetIds) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            RemoteViews collectionRemoteView = getRemoteViews(widgetId, context);
            appWidgetManager.updateAppWidget(widgetId, collectionRemoteView);
        }

    }
}

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@SuppressWarnings("deprecation")
private RemoteViews getRemoteViews(int widgetId, Context context) {
    // Sets up the intent that points to the RemoteViewService
    // that will
    // provide the views for this collection.
    Intent widgetUpdateServiceIntent = new Intent(context,
            RemoteViewsService.class);
    widgetUpdateServiceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    // When intents are compared, the extras are ignored, so we need
    // to embed the extras
    // into the data so that the extras will not be ignored.
    widgetUpdateServiceIntent.setData(
            Uri.parse(widgetUpdateServiceIntent.toUri(Intent.URI_INTENT_SCHEME)));
    RemoteViews collectionRemoteView = new RemoteViews(context.getPackageName(),
            R.layout.widget_collection);
    collectionRemoteView.setRemoteAdapter(widgetId,
            R.id.widgetColectionRoot, widgetUpdateServiceIntent);

    collectionRemoteView.setEmptyView(R.id.widgetColectionRoot, R.id.widgetEmpty);

    // This section makes it possible for items to have
    // individualized behavior.
    // It does this by setting up a pending intent template.
    // Individuals items of a collection
    // cannot set up their own pending intents. Instead, the
    // collection as a whole sets
    // up a pending intent template, and the individual items set a
    // fillInIntent
    // to create unique behavior on an item-by-item basis.
    Intent selectItemIntent = new Intent(context,
            BrochuresWidgetProvider.class);

    Intent refreshIntent = new Intent(selectItemIntent);
    refreshIntent.setAction(ACTION_WIDGET_UPDATE);
    PendingIntent refreshPendingIntent = PendingIntent.getBroadcast(
            context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    collectionRemoteView.setOnClickPendingIntent(R.id.widgetReload,
            refreshPendingIntent);
    return collectionRemoteView;
}

当然,您还需要在窗口小部件提供程序声明中的清单上注册该intent-filter。