2010-08-25 10 views
9

Quisiera un botón en mi widget para activar el intento APPWIDGET_UPDATE en la clase de widget para forzar una actualización, pero no veo APPWIDGET_UPDATE como un campo estático en Intent.¿Es posible lanzar un intento para APPWIDGET_UPDATE programáticamente?

¿Es esto posible y cómo se puede hacer 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); 

Respuesta

15

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

intent.setAction (AppWidgetManager.ACTION_APPWIDGET_UPDATE)

Editar: Usted tendrá que 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); 
+0

Gracias. Veo el intento de fuego en adb logcat, pero el widget no se actualiza. ¿Algo más que debería estar haciendo? Ya tengo APPWIDGET_UPDATE como filtro de intención en mi archivo de manifiesto. – NPike

+0

'onUpdate()' no se llama? Tendré que responderte sobre eso. – Justin

+0

Deberá proporcionar los ids de los widgets para actualizar. Si desea actualizar todas las instancias de su widget, puede obtener una lista completa de los identificadores del 'AppWidgetManager' (he editado mi comentario para incluir el código). – Justin

2

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 evitar que la respuesta exista funcione 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 que la intención del filtro en su manifiesto, dentro de su declaración de proveedor de widgets.

Cuestiones relacionadas