8

Sto creando un'app di pianificazione SMS che richiederà semplicemente tempo, sms e numero da parte dell'utente e inviare questo sms in un dato momento. Sto usando PendingIntent. Ecco il mio codice di esempio.Come interrompere BroadcastReceiver in Android

Quando l'utente crea una pianificazione, chiama semplicemente questo metodo.

private void SendMessages() 
    { 
     Intent intent = new Intent(this, SMSBroadcastReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(
       this.getApplicationContext(), 234324243, intent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent); 
    } 

E qui è il file 'SMSBroadcastReceiver.java'

La mia domanda è: quando l'utente modifica il programma, come posso cancellare quella broadcast e inviare un nuovo ??? Come può esserci più di un programma, come trovare lo specifico per cambiare/abortire?

risposta

10

quando l'utente modifica il programma, come posso cancellare quella broadcast e inviare un nuovo uno?

chiamata cancel() su AlarmManager con un equivalente PendingIntent a quello utilizzato per impostare il programma:

Intent intent = new Intent(this, SMSBroadcastReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 234324243, intent, 0); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

alarmManager.cancel(pendingIntent); 

Come ci può essere più di un programma, come trovare lo speicific al cambiamento/abortire?

C'è solo un allarme nella vostra implementazione.

+1

ma cosa succede se voglio aggiungere più allarmi ?? –

+4

@DawoodAbbasi: usa ID distinti per ciascuno (il tuo '234324243'). – CommonsWare

+1

È facile strutturarlo in modo che solo un allarme sia attivo in qualsiasi momento. Provare a ordinare tutti gli allarmi in sospeso in base al tempo di consegna desiderato, quindi pianificare quello più vicino. Quando l'allarme scatta, guarda la tua lista (tieni nel database?) E scegli il più vicino. –

6

Se si dispone di un riferimento all'intenzione in sospeso, è possibile cancel l'intento. Se si desidera interrompere una trasmissione corrente, è possibile utilizzare abortBroadcast.

Consulta anche:

1) How to get and cancel a PendingIntent?

2) Stop pending intent

3) Aborting/Cancelling Broadcasts

+0

Devo interrompere qualsiasi intenzione in sospeso non solo corrente come ho menzionato nella domanda –

+0

Forse dovresti tenere un riferimento a ogni nuovo intento in sospeso che fai, quindi se trovi che devi cancellarlo in seguito, puoi ripetere l'iterazione in sospeso intenti e utilizzare il metodo di annullamento di cui sopra. –

0
  • finale pubblica vuoto abortBroadcast()

aggiunte a livello di API 1 imposta il flag che indica che il ricevitore deve interrompere la trasmissione corrente; funziona solo con le trasmissioni inviate tramite Context.sendOrderedBroadcast. Ciò impedirà a qualsiasi altro destinatario di trasmissione di ricevere la trasmissione. Sarà ancora chiamare OnReceive (Context, intenti) della BroadcastReceiver che il chiamante di Context.sendOrderedBroadcast passata.

Questo metodo non funziona con le trasmissioni non ordinato, come quelli inviati con Context.sendBroadcast

0

Se stai solo cambiando Timemilli, puoi chiamare di nuovo la tua funzione sendMessage().

alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent); 

L'AlarmManager.set() funzione si annulla l'allarme precedente automaticamente finché il pendingIntent è lo stesso; non deve essere la stessa istanza, ma deve essere "abbinata" in base all'intento.filterEquals():

A causa di questo comportamento, è importante sapere quando due Intenti sono considerati uguali ai fini del recupero di un PendingIntent. Un errore comune che si crea è 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 oggetti Intent equivalenti a Intent.filterEquals, si otterrà lo stesso PendingIntent per entrambi.

http://developer.android.com/reference/android/app/AlarmManager.html#set(int, lunga, android.app.PendingIntent)

http://developer.android.com/reference/android/app/PendingIntent.html http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)

Problemi correlati