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

想要在我的小部件中的一个button触发小部件类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); 

Solutions Collecting From Web of "是否有可能以编程方式抛出APPWIDGET_UPDATE的意图?"

是的 ,这是可能的。 你会在AppWidgetManagerfind这个动作:

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); 

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

这是我的解决scheme,使用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; } 

当然,您还需要在您的Widget提供者声明中注册您的清单上的意图filter。