2010-06-09 8 views
72

Nella mia app è in corso un allarme e viene avviata una notifica che, una volta eseguita, ha avviato un'attività. Il problema è che quando creo più di un allarme, l'attività lanciata dalla notifica ottiene gli stessi extra del primo. Penso che il problema sia con l'intento che ho inserito nell'intento in sospeso o nell'intento in sospeso. Penso che potrebbe essere necessario mettere una bandiera su uno di questi, ma non so quale.problema di notifica dell'intenzione in attesa di Android

Intent showIntent =new Intent(context, notificationreceiver.class); 
    showIntent.putExtra("details", alarmname); 

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
     showIntent, 0); 

    notification.setLatestEventInfo(context, "The event is imminent", 
      alarmname, contentIntent); 

E il destinatario della notifica

Bundle b = getIntent().getExtras(); 
    String eventname = b.getString("details"); 
    details.setText(eventname); 

"Dettagli" è più la stessa per ogni la prossima volta che una notifica avviene invece di avere il valore diverso. Fino a quando non ho impostato le intenzioni, sono sicuro che il valore corretto va ai "dettagli", quindi è un problema di ottenere il primo intento ogni volta che preme qualsiasi notifica. Come posso farlo per lanciare gli intenti corretti? Spero di essere stato il più chiaro possibile Grazie!

+0

Quello che ho fatto è dato che sto usando un notificationId univoco per tenere traccia degli stati (notifica della barra di stato), uso la stessa variabile per passare al mio PendingIntent rendendolo così unico. –

risposta

68

Il problema è che quando creo più di un allarme allora l'attività lanciato dalla notifica ottiene gli stessi extra come il primo.

Corretto.

Come posso far sì che venga lanciato l'intento corretto di ?

Questo dipende dal fatto che siano presenti due allarmi che verranno registrati contemporaneamente oppure no.

In caso contrario, è possibile use FLAG_ONE_SHOT or one of the other PendingIntent flags avere il secondo PendingIntent utilizzare gli extra più recenti.

Se, tuttavia, si avrà due allarmi registrati in una sola volta, con diversi Intent extra, avrete bisogno di fare i due Intents essere più materialmente diversi, in modo tale che i rendimenti filterEquals()false quando si confrontano i due. Ad esempio, è possibile chiamare setData() o setAction() e fornire valori diversi per ogni Intent.

+2

Grazie mille amico per l'aiuto. Poiché esiste la possibilità di far scattare gli allarmi insieme e di avere più di una notifica sulla barra delle notifiche, ho utilizzato il flag FLAG_UPDATE_CURRENT per l'intento in sospeso. Ma il vero affare era come hai detto di impostare Azione con l'intento del nome dell'allarme e ora potrebbe sapere quali intenti sono diversi e quali sono gli stessi. Grazie ancora! – spagi

+2

setAction ha funzionato anche per me. Mi chiedo solo perché l'SDK ufficiale non lo menzioni. –

+0

setAction funziona, grazie a TON. L'utilizzo di setAction mi ha aiutato a differenziare tutti gli oggetti in sospeso, semplicemente fantastico! – Soham

116

Il modo in cui ho risolto il problema era assegnando un unico requestCode quando si ottiene il PendingIntent:

PendingIntent.getActivity(context, requestCode, showIntent, 0); 

In questo modo si effettua la registrazione con il sistema differenti/uniche istanze di intenti. Suggerimento: Un buon modo per rendere la requestCode univoca consiste nel passare ad esso l'ora corrente del sistema.

int requestID = (int) System.currentTimeMillis(); 
+9

requestCode in effetti non è ancora utilizzato da nulla, ma rende gli intenti univoci che impediscono loro di essere sovrascritti! Ottimo lavoro u-ramos! – Kitteh

+1

Anche se 'TaskStackBuilder' è in uso, abbiamo un metodo lì' getPendingIntent (int requestCode, int flags) '. Ecco come passare questo requestID. –

+1

Fai attenzione, currentTimeMillis è di tipo long, quindi se lanci su int, verrà troncato. Non so quanto sia probabile e se è importante, ma potrebbe essere ripetuto. In questo caso è possibile utilizzare un valore incrementale statico – djpeinado

1

un'altra soluzione:

utilizzare il PendingIntent.FLAG_UPDATE_CURRENT come questo:

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,i, PendingIntent.FLAG_UPDATE_CURRENT); 

questo ha funzionato per me

+0

Questo non funziona. Sostituisce i vecchi parametri e li sostituisce con quelli nuovi –

0

ho avuto questo problema nella mia app e solo generato un numero casuale a più di venire ignorando le notifiche intento:

int random= new Random().nextInt(); 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(
       random, 
       PendingIntent.FLAG_UPDATE_CURRENT 
    ); 
Problemi correlati