2013-02-23 10 views
8

Dal documentation of Pending Intent FLAG_CANCEL_CURRENT in Android:chiarimenti sui documenti per PendingIntent.FLAG_CANCEL_CURRENT

cancellando il precedente intento in attesa, questo garantisce che solo gli enti forniti i nuovi dati saranno in grado di lanciarlo. Se questa garanzia non è un problema, considera FLAG_UPDATE_CURRENT

Qualcuno può spiegare cosa significa questa linea?

+1

@VikalpPatel - la modifica era sbagliata - l'OP aveva ragione - si prega di fare attenzione –

risposta

22

Una volta che si crea un nuovo PendingIntent con FLAG_CANCEL_CURRENT, qualsiasi cosa in possesso di un precedente PendingIntent per lo stesso Intent non sarà più in grado di eseguire quella originale PendingIntent.

Per esempio, supponiamo di avere questo:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 1); 

PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0); 

e usiamo che PendingIntent con, diciamo, un Notification.

Più tardi, eseguiamo:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 2); 

PendingIntent pi2=PendingIntent.getActivity(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 

A questo punto, il PendingIntent creato in origine (pi) non è più valida, e tutto ciò che usiamo per pi2 vedrà il valore aggiunto aggiornato (2).

Se, invece, abbiamo fatto:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 2); 

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

A questo punto, pi e pi2 entrambi rappresentano la stessa PendingIntent, ed entrambi vedranno il valore aggiunto aggiornato (2).

Oppure, se abbiamo fatto:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 2); 

PendingIntent pi2=PendingIntent.getActivity(this, 0, i, 0); 

A questo punto, pi e pi2 rappresentano ancora la stessa PendingIntent, ma gli extra sono invariati, come getActivity() restituisce il originalePendingIntent senza applicare i nuovi extra.

La maggior parte delle volte, FLAG_UPDATE_CURRENT è una risposta soddisfacente quando si tenta di sostituire gli extra all'interno di uno PendingIntent.

+0

Intenzione i = nuovo intento (questo, Foo.class); i.putExtra ("chiave", 1); PendingIntent pi = PendingIntent.getActivity (questo, 0, i, 0); AlarmManager am = Context.getSystemService (Context.ALARM_SERVICE); am.set (ELAPSED_REALTIME, mTime, pi); Intenzione i = nuovo intento (questo, Foo.class); i.putExtra ("chiave", 2); PendingIntent pi2 = PendingIntent.getActivity (questo, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); am.set (ELAPSED_REALTIME, mTime1, pi2); Quindi, ora quando il gestore degli allarmi scade al momento mTime, l'intento pi in sospeso non verrà chiamato? – pikini

+2

@pikini: mi aspetterei che gettare "PendingIntent.CanceledException". Presumibilmente, 'AlarmManager' ha una logica per affrontare questo.Se si desidera annullare un allarme, tuttavia, è meglio chiamare 'cancel()' piuttosto che lasciare che 'AlarmManager' gestisca l'eccezione, IMHO. – CommonsWare

+0

Grazie per la risposta. Proverò a fare questo e condividere i miei risultati. Grazie per il tuo tempo di risposta. – pikini

Problemi correlati