2010-07-25 25 views
33

Escribo algo así como un recordatorio para los usuarios. Los usuarios establecerán recordatorios para sus eventos, cuando llegue el momento, se establecerá una alarma repetitiva para activar una notificación de la barra de estado. Pero la alarma parece no detenerse después de que seleccioné la notificación o borré la notificación. No estoy seguro de dónde cancelar esta alarma repetitiva. A continuación se presentan algunos de los códigos: Configurar la alarma que se repite en mi actividad¿Cómo cancelar esta alarma repetitiva?

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); 

En mi método OnReceive, sólo se muestre la notificación en la barra de estado y Active la marca 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); 

¿Cómo puedo detener la alarma cuando el usuario selecciona la notificación o la borra?

Respuesta

76

llamada cancel() en AlarmManager con un equivalente PendingIntent a la que utilizó 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

quiero cancelar esta alarma cuando el usuario ve la notificación, pero la notificación se define en onReceive. Entonces, ¿cómo puedo determinar si el usuario conoce la notificación en mi actividad principal antes de cancelar la alarma? Gracias – Wen

+2

@Wen: use un Intento diferente (por ejemplo, acción diferente) para iniciar su actividad principal de la Notificación que la que usa para el iniciador . O bien, si lleva una instancia existente de la actividad principal al primer plano, su Notificación activará onNewIntent() en la actividad, por lo que puede cancelar la alarma allí. – CommonsWare

+0

La notificación activará otra actividad. ¿Qué quiere decir con el uso de una intención diferente para iniciar la actividad de la Notificación que el uso para el iniciador? – Wen

3

En su MainActivity, ajuste la hora de alarma. Si va a usar varias alarmas, use SharedPreferences para almacenar sus respectivas identificaciones. Aquí está el código:

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; 

En su segunda Activity uso del mismo ID SharedPreferences. En mi código, obtengo el ID de ArrayList, Alarm_id. Por último, puede usar el contexto MainActivity aquí con MainActivity.getContext(). Aquí está el código:

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

Intenté varios métodos y no pude conseguir que funcionase, así que decidí hacer un truco sucio. Cuando quiero cancelar mi alarma repetitiva, utilizo el mismo método que creó mi alarma (y por lo tanto reemplazando la anterior) y luego la cancela de inmediato. Con este método si la variable booleana se establece en true se activa una alarma flujo al que sustituye y anula la sustitución que tiene la misma 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); 
    } 
Cuestiones relacionadas