2010-09-02 12 views
6

ho ottenuto un widget sul mio HomeScreen su cui aggiungo uno scatto a un pulsante. Passo il widget di id dal Widget su di un servizio, ma quando im lettura del WidgetId al servizio è sempre 3.Android: Passando AppWidgetId ad un Servizio di

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

Il servizio è simile al seguente:

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

Quindi cosa sto sbagliando?

risposta

4

Quello che stai cercando di fare non funziona, per quanto ne so, senza alcun inganno.

Non ci può essere un solo eccezionale PendingIntent per Intent. Quindi, se crei due Intents equivalenti (corrisponde a dati non aggiuntivi) e provi a creare due PendingIntents, alla fine si finisce con un singolo PendingIntent. Quale Intent viene utilizzato dipende un po 'sulle bandiere che fornite a getService() (o getActivity() o getBroadcast()). Nel tuo caso, verrà sempre utilizzato il primo Intent.

Se si dispone solo di uno straordinario PendingIntent ma si desidera aggiornare solo gli extra, il lavoro FLAG_UPDATE_CURRENT funzionerà. Ma vuoi N eccezionale PendingIntents.

L'unico modo che conosco per fare quel lavoro nel tuo caso è quello di mettere una stringa un'azione unica nel Intent. Poiché si specifica il componente (WidgetService.class), la stringa di azioni non verrà utilizzata per il routing. Tuttavia, sarà sufficiente fornire più oggetti PendingIntent.

3

solo per aggiungere al commento di cui sopra, si veda questo esempio di come rendere il vostro intento unico: http://developer.android.com/resources/samples/StackWidget/src/com/example/android/stackwidget/StackWidgetProvider.html Sembra un design davvero muto e una soluzione ancora peggiore, ma credo che sia il modo in cui è. Mi ci è voluto molto tempo per trovare il semplice esempio sopra. Prestare particolare attenzione alla chiamata intent.setData (Uri). Ho tagliato e incollato quelle linee nel mio metodo onUpdate() e alla fine ha funzionato.

+0

grande scoperta. Ho cercato di risolvere questo problema per un po ', e da sempre come nell'esempio di base. Accidenti. Grazie mille! – icecreamman

Problemi correlati