2010-10-25 16 views
18

Ho un WidgetProvider e un Configura attivitàpiù istanze di widget solo Aggiornamento Ultimo widget di

Quando il widget viene avviato inizia con l'attività di configurazione e impostare il tutto effettuando una chiamata personalizzata al widgetprovider

(che si nota è dagli esempi del tutorial sdk)

// Push widget update to surface with newly set prefix 
       AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
       AwarenessWidget.updateAppWidget(context, appWidgetManager, 
         mAppWidgetId, position); 

      // Make sure we pass back the original appWidgetId 
      Intent resultValue = new Intent(); 
      resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 
      setResult(RESULT_OK, resultValue); 
      finish(); 

passo il widget ID alla funzione .... all'interno del widget di creo un intento simile a questo:

012.
Intent configIntent = new Intent(context, Configure.class); 
    configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 

    PendingIntent pendingIntent = PendingIntent.getActivity 
    (context, 0, configIntent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 

    views.setOnClickPendingIntent(R.id.MainImage,pendingIntent); 

    views.setImageViewResource(R.id.MainImage, lv_images[version]); 

    appWidgetManager.updateAppWidget(appWidgetId, views); 

Sono sempre riferimento al widget di ID e persino aggiungere come extra sul intento , ma quando torno a due di questi widget sulla schermata iniziale l'ID widget è sempre riferimento a l'ultimo posto widget di ID

risposta

49

Ho avuto un problema simile. Basta aggiungere questo per la vostra attività di configurazione, in cui si imposta la PendingIntent:

Uri data = Uri.withAppendedPath(
    Uri.parse(URI_SCHEME + "://widget/id/") 
    ,String.valueOf(appWidgetId)); 
intent.setData(data); 

L'URI_SCHEME variabile è una stringa, e può essere tutto ciò che vuoi .. vale a dire - "ABCD" Questo fa sì che ciascun widget per avere un PendingIntent unico.

+0

non imposto un pendingintent nella mia attività di configurazione, solo nella funzione widget che l'attività chiama – morty346

+0

ok, appena fuori nella mia funzione di widget e si lavorato – morty346

+2

+1 bel trucco :) –

36

Ecco una spiegazione più approfondita del perché il codice non funziona e come risolverlo. Dal Android SDK Documentation:

Un PendingIntent sé è semplicemente un riferimento a un token mantenuto da sistema che descrive i dati originali utilizzati per recuperarla. Questo significa che, anche se il processo dell'applicazione proprietaria viene ucciso, lo stesso PendingIntent rimarrà utilizzabile da altri processi che hanno ricevuto . Se l'applicazione di creazione recupera in seguito lo stesso tipo di PendingIntent (stessa operazione, stessa azione, dati, categorie e componenti e gli stessi flag), riceverà un PendingIntent che rappresenta lo stesso token se è ancora valido e può quindi chiamare cancel() per rimuoverlo.

A causa di questo comportamento, è importante sapere quando due Intenti sono considerati uguali per il recupero di un PendingIntent. Un errore comune è creare più oggetti PendingIntent con Intenti che variano solo nei loro contenuti "extra", aspettandosi di ottenere ogni volta un PendingIntent diverso. Questo non succede . Le parti dell'Intento utilizzate per la corrispondenza sono le stesse definite da Intent.filterEquals. Se si utilizzano due intenti oggetti equivalenti a Intent.filterEquals, allora lo otterrà lo stesso PendingIntent per entrambi.

Si noti che la specifica di contenuti "extra" diversi non è sufficiente per considerare gli oggetti in sospeso univoci, ma l'impostazione di un URI univoco con setData è. Ecco perché la soluzione URI di Snailer "magicamente" risolve il problema.

La documentazione offre anche una soluzione diversa (probabilmente più semplice) al problema.Invece di creare un costume URI sufficiente impostare un requestCode unica quando si chiama getActivity:

PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Fonte: http://developer.android.com/reference/android/app/PendingIntent.html

+0

Da SDK, sembra che il requestCode non sia attualmente in uso ... – ken

+1

requestCode non è attualmente utilizzato dall'SDK ma fa sì che l'Intent sia considerato univoco. La documentazione suggerisce che questo è un uso valido di requestCode: "o diversi numeri di codice di richiesta forniti per ottenereActivity" –

+0

Impressionante, molto utile – Dima

10

Nel mio test, utilizzando il setData (...) sulla PendingIntent non risolve il problema su un Verizon Thunderbolt con Android 4.0.4. Funziona con altri dispositivi di prova ed emulatore.

Ho provato l'uso del codice di richiesta, invece, e funziona in tutti i casi. Ho appena impostato il requestCode essere il widget di ID:

pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
+1

Ottima soluzione. Hai bisogno di ore per trovare questo. Molte grazie. –

Problemi correlati