2010-07-25 19 views
33

Sto scrivendo qualcosa come un promemoria per gli utenti. Gli utenti imposteranno promemoria per i loro eventi, quando arriverà il momento, verrà impostato un allarme ripetuto per attivare una notifica sulla barra di stato. Ma l'allarme sembra non-stop dopo che ho selezionato la notifica o cancellato la notifica. Non sono sicuro di dove cancellare questo allarme ripetuto. Qui di seguito sono alcuni dei codici: Impostare l'allarme si ripete nella mia attività principaleCome cancellare questo allarme ripetuto?

alarmTime = Calendar.getInstance(); 
Intent intent = new Intent(this, AlarmReceive.class); 
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

alarmTime.add(Calendar.MINUTE,offset_time); 

//Schedule the alarm 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), 30 * 1000, sender); 

Nel mio metodo OnReceive, ho appena visualizzo la notifica nella barra di stato e impostare il flag come FLAG_AUTO_CANCEL

manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); 

// Set the icon, scrolling text and timestamp 
Notification notification = new Notification(R.drawable.medical, text, System.currentTimeMillis()); 

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0); 

notification.flags = Notification.FLAG_AUTO_CANCEL; 

manager.notify(R.string.service_text, notification); 

Come posso interrompere l'allarme quando l'utente seleziona la notifica o la cancella?

risposta

76

chiamata cancel() su AlarmManager con un equivalente PendingIntent a quello utilizzato con setRepeating():

Intent intent = new Intent(this, AlarmReceive.class); 
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

alarmManager.cancel(sender); 
+3

voglio cancellare questo allarme dopo che l'utente vede la notifica, ma la notifica è definito in onReceive. Quindi, come posso determinare se l'utente conosce la notifica nella mia attività principale prima di annullare l'allarme? Grazie – Wen

+2

@Wen: utilizzare un diverso intento (ad esempio, un'azione diversa) per avviare l'attività principale dalla notifica rispetto a quella utilizzata per il programma di avvio . Oppure, se stai portando un'istanza esistente dell'attività principale in primo piano, la tua Notifica si attiverà su NewNewIntent() nell'attività, quindi puoi cancellare l'allarme lì. – CommonsWare

+0

La notifica attiverà un'altra attività. Che cosa intendi con un diff Intent per avviare l'attività dalla notifica rispetto all'uso per il programma di avvio? – Wen

3

Nella tua MainActivity, impostare l'ora della sveglia. Se utilizzi più allarmi, utilizza SharedPreferences per memorizzare i rispettivi ID. Ecco il codice:

PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _id,intent, PendingIntent.FLAG_UPDATE_CURRENT); 
alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), 
      pendingIntent); 

public static Context getContext() { 
    return mContext; 
} 
mContext=mainactivity.this; 

Nel tuo secondo Activity uso stesso ID da SharedPreferences. Nel mio codice, ottengo l'ID da ArrayList, Alarm_id. Infine, puoi utilizzare il contesto MainActivity qui con MainActivity.getContext(). Ecco il codice:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
Intent intentAlarm = new Intent(AlarmListviewActivity.this, 
     MainActivity.class); 
PendingIntent morningIntent = PendingIntent.getBroadcast(MainActivity.getContext(), Alarm_id.get(positon), 
     intentAlarm, PendingIntent.FLAG_CANCEL_CURRENT); 

alarmManager.cancel(morningIntent); 
morningIntent.cancel(); 
4

Ho provato vari metodi e non riuscivo a farlo funzionare, così ho deciso di fare un trucco sporco. Quando voglio annullare l'allarme ripetuto, uso lo stesso metodo che ha creato il mio allarme (e quindi sostituendo il vecchio) e poi lo annullo subito. Con questo metodo se la variabile booleana è impostata su true crea un allarme ow sostituisce e quindi annulla la sostituzione, che ha lo stesso ID:

static void CancelRepeatingAlarm(Context context, boolean creating){ 
    //if it already exists, then replace it with this one 
    Intent alertIntent = new Intent(context, AlertReceiver.class); 
    PendingIntent timerAlarmIntent = PendingIntent 
      .getBroadcast(context, 100, alertIntent,PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    if (creating){ 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), INTERVAL, timerAlarmIntent); 
    }else{ 
     alarmManager.cancel(timerAlarmIntent); 
    }