Sto usando AlarmManager per impostare intenti ripetuti ma ha causato alcuni piccoli problemi quindi spero che qualcuno possa aiutare.Come creare diversi suggerimenti in sospeso in modo che filterEquals() restituisca false?
Sommario
Ci sono 2 intenti in attesa. Una corre a 1000 e un'altra corre a 2000 ogni giorno. Ciascuno contiene un ID riga dal database a scopo di identificazione. Il codice simile a questa:
Intent i = new Intent(mContext, ScheduleReceiver.class);
i.putExtra(RuleDBAdapter.KEY_ROWID, (int)taskId);
PendingIntent pi =PendingIntent.getBroadcast(...);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi);
Soppressione:
Il problema è quando abbiamo bisogno di eliminare uno di loro. Il modo corretto per eliminare un intent in sospeso è impostarne uno identico e quindi chiamare cancel da AlarmManager.
Android Documentazione:
public void cancel (PendingIntent operation)
Rimuovere eventuali allarmi con un intento di corrispondenza. Qualsiasi allarme, di qualsiasi tipo, di cui Intent corrisponde a questo (come definito da filterEquals (Intent)), verrà annullato.public boolean filterEquals (Intent other)
determinare se due intenti sono uguali ai fini della risoluzione intenti (filtraggio). Cioè, se la loro azione, i dati, il tipo, la classe e le categorie sono gli stessi. Questo non confronta alcun dato aggiuntivo incluso negli intenti.
Così, nell'esempio di cui sopra, se faccio un intento identico quindi annullare, sia degli intenti di cui sopra otterrà annullati, perché sono dalla stessa classe/stessa azione etc (ad eccezione dei dati "extra" è rowId ma filterEquals
non si preoccupa dei dati extra).
C'è qualche soluzione per questo?
grazie! prob che funzionerà. Non sapevo che è semplice come questo. :) – markbse
Vorrei che aggiornassero la documentazione, perché dire "non usato" per la requestCode è davvero intimidatorio quando si cerca di far funzionare qualcosa. –
Attenzione: requestCode è definito come int mentre normalmente gli ID di riga (sqlite) sono lunghi. – HaimS