Visualizzazione stampabile
-
PendingIntent
Apro un altro topic, magari può essere utile dato che è un problema ricorrente in android e non ancora esiste una soluzione precisa.
Il caso d'uso è questo: inviare un SMS tramite le API di Android e attraverso due pending intent: SendPI e DeliveredPI che viaggiano in broadcast e contengono, rispettivamente, se il messaggio è stato inviato e se il messaggio è stato recapitato.
Il problema è questo: i PendingIntent, quando inviati in Broadcast, non vengono rimossi una volta catturati, ma continuano a girare.
Esempio: Invio un primo sms con la mia applicazione ed il funzionamento è corretto. A distanza di qualche secondo, decido di inviarne un altro; in questo caso il mio broadcastReceveir che si preoccupa di "ascoltare" i PendingIntent inviati in broadcast, NE RICEVE DUE (quello nuovo e quello vecchio). E così via...
Tra i vari flag dei PendingIntent ho notato FLAG_ONE_SHOT, FLAG_UPDATE_CURRENT ed altri che comunque servono solo per gestire l'extra dell'intent.
Dunque: come poter risolvere questo problema dei PendingIntent? Esiste un modo per eliminarli dal broadcast??
Oppure, esiste un modo su Android per leggere, ad un determinato istante, la lista dei PendingIntent che girano in Broadcast?
Un consiglio, a detta di Dianne Hackborn, consiste nell'utilizzare un Activity, invece del Broadcast, ossia invocare getActivity(.....) invece che getBroadcast(...). In questo modo il PendingIntent verrebbe "consumato" ed eliminato dal Broadcast.
Tuttavia, l'utilizzo di un Activity non è sempre ottimale (io, personalmente, prediligo i Broadcast per le operazioni di basso livello) soprattutto se con quell'intent non c'è necessità di avere eventi dall'esterno.
Qualcuno di voi ha idee a riguardo su questo argomento??
-
Sai che non ho mai notato questo tipo di comportamento ? Io ho sempre usato UPDATE_CURRENT e tutto funzionava.
-
Guarda, secondo quanto ho capito, UPDATE_CURRENT consente di sovrascrivere l'extra dell'ultimo intent. Ad esempio:
codice:
Intent a = new Intent("MY_STRING")
a.putExtra("num", num); //supponendo num=1
....
getBroadcast(....a....);
Ad un secondo giro, fai
codice:
Intent a = new Intent("MY_STRING");
a.putExtra("num", num) //supponendo num=2
....
getBroadcast(....a....);
Con num che cambia....
Sai che succede? Rimangono appesi due intent che girano in broadcast ENTRAMBI CON L'ULTIMO VALORE DI NUM settato.
Deve esserci un modo per disabilitare i PendingIntent, non mi va di chiamare abortBroadcast().....
Che ne pensi=
-
Ciao a tutti, io uso un codice del genere:
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALA RM_SERVICE);
Intent i = new Intent(context, Gps.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAK EUP, SystemClock.elapsedRealtime(), Integer.parseInt(Utilities.strFreqSend)*1000, pi);
se io avessi questa classe Gps con al suo interno una funzione start(), come potrei richiamarla ciclicamente in modo analogo????????????