¿Es posible lanzar una intención para APPWIDGET_UPDATE mediante programación?

Desea que un botón de mi widget dispare la intención APPWIDGET_UPDATE en la clase de widget para forzar una actualización, pero no veo APPWIDGET_UPDATE como campo estático en Intent.

¿Es esto posible, y cómo uno haría esto?

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

, es posible. Encontrará la acción en AppWidgetManager :

Intent.setAction (AppWidgetManager.ACTION_APPWIDGET_UPDATE)

Editar: Deberá proporcionar los identificadores de los widgets que desea actualizar. A continuación se muestra una muestra completa.

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

Sé que esta es una pregunta muy antigua, pero creo que esto podría ser interesante, porque Android actualizó las políticas de actualización de AppWidgets. Creo que este cambio podría impedir que la respuesta exising funcionara como se esperaba.

Esta es mi solución, usando RemoteViews y una colección.

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

Por supuesto, también es necesario registrar ese filtro de intenciones en el manifiesto, dentro de la declaración del proveedor de widgets.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.