9

Uso un allarme per recuperare i dati dal server. Mi piace dare all'utente la possibilità di avviare e interrompere l'allarme. Ciò significa che devo controllare e vedere se l'allarme è già impostato. Ho trovato un po 'di codice che mi dice che se l'allarme è già impostata:Problema AlarmManager Android con impostazione e ripristino di un allarme

Intent I = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_NO_CREATE); 
found = (P!=null); 

se l'allarme è già impostato a cancellare, ma se non è impostata, allora ho impostato (come un interruttore)

Il problema è che funziona solo una volta. La prima volta che il codice sopra riportato per verificare gli allarmi esistenti restituirà un valore null che indica nessun allarme, ma dopo aver annullato l'allarme una volta che restituisce un puntatore a qualcosa ma l'allarme non è in esecuzione.

Ecco il codice per impostare l'allarme

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE); 
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT); 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60000, P); 

e qui è il codice per disattivare la sveglia:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE); 
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT); 
am.cancel(P); 

sono io per reimpostare qualcosa dopo l'annullamento di un allarme per farlo è PendingIntent andare via .

+1

Io non sono davvero sicuro perché si sta eseguendo il controllo per vedere se un allarme è già esistente. Puoi spiegare il tuo ragionamento per favore? –

+0

Volevo avere un pulsante che agisce come un interruttore on/off. Utilizzare anche il pulsante come indicatore se la mia impostazione di allarme è stata persa a causa di crash dell'applicazione. Uso l'allarme per aggiornare un widget quando l'utente fa clic sul widget per aprire un'attività in cui l'utente può vedere se l'allarme è impostato o meno. Ciò di cui ho paura è dopo aver impostato l'allarme che verrà disattivato e l'utente non saprà che è disattivato. – Kemal

risposta

49

Quando si annulla il AlarmManager non utilizzare uno PendingIntent con una bandiera di FLAG_CANCEL_CURRENT. Invece, annullare la PendingIntent esplicitamente dopo aver annullato l'allarme:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE); 
Intent i = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 
am.cancel(p); 
p.cancel(); 
+1

grazie mille. p.cancel() aiutato qui! – Karussell

+7

Dovresti segnare come risposta se ti ha aiutato. –

+1

Questo dovrebbe ricevere +50 perché nessuno degli altri messaggi risolve l'annullamento di 'PendingIntent' come pure di' AlarmManager', e sto usando '(PendingIntent.getBroadcast (getBaseContext(), 0, checkIntent, PendingIntent.FLAG_NO_CREATE)! = null); 'per verificare se il mio allarme è in esecuzione e questa è l'unica cosa che ha funzionato senza riavviare la mia attività. Ottimo lavoro. –