2010-09-02 22 views
6

Tengo un widget en mi pantalla de inicio en el que agrego un clic a un botón. Paso el Identificación del widget de la Widget a un servicio, pero cuando estoy leyendo el moduloid en el servicio es siempre 3.Android: pasar AppWidgetId a un servicio

Widget:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
int[] appWidgetIds) { 

    for (int appWidgetId : appWidgetIds) { 
     RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget); 

     Intent intent = new Intent(context, WidgetService.class); 


     // prints the correct appWidgetId 
     System.out.println(appWidgetId); 


     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

     remoteView.setOnClickPendingIntent(R.id.Button01, pendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetId, remoteView); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

El servicio tiene el siguiente aspecto:

public int onStartCommand(Intent intent, int flags, int startId){ 
    if (intent != null && intent.getExtras() != null) { 

     int widgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 

     // 3 is always printend 
     System.out.println(widgetId); 

     // More stuff here 

    } 
    return super.onStartCommand(intent, flags, startId); 
} 

Entonces, ¿qué estoy haciendo mal?

Respuesta

4

Lo que estás tratando de hacer no funcionará, AFAIK, sin algunos trucos.

Solo puede haber un PendingIntent pendiente por Intent. Por lo tanto, si crea dos Intents que son equivalentes (coinciden con datos no extra) e intenta crear dos PendingIntents, realmente terminará con un solo PendingIntent al final. ¿Qué Intent se utiliza depende un poco de las banderas que suministra a getService() (o getActivity() o getBroadcast()). En su caso, siempre se usará el primer Intent.

Si solo tenía un PendingIntent excepcional pero solo quería actualizar sus extras, FLAG_UPDATE_CURRENT funcionaría. Pero, quieres N sobresaliente PendingIntents.

La única forma que conozco de hacer que funcione en su caso es poner una cadena de acción única en el Intent. Como está especificando el componente (WidgetService.class), la cadena de acción no se usará para el enrutamiento. Sin embargo, bastará con darle múltiples objetos PendingIntent.

3

sólo para añadir al comentario anterior, ver este ejemplo de cómo hacer que su intención único: http://developer.android.com/resources/samples/StackWidget/src/com/example/android/stackwidget/StackWidgetProvider.html Parece un diseño realmente tonto y una solución aún peor, pero supongo que esa es la manera que es. Me llevó mucho tiempo encontrar el simple ejemplo anterior. Preste especial atención a la llamada intent.setData (Uri). Corté y pegué esas líneas en mi método onUpdate() y finalmente funcionó.

+0

gran descubrimiento. He estado tratando de resolver este problema por un tiempo, y todo el tiempo como en el ejemplo de la línea de base. Geez. ¡Gracias un montón! – icecreamman

Cuestiones relacionadas