¿Cómo cancelar esta alarma repetitiva?

Estoy escribiendo 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 encuentran algunos de los códigos: configurar la alarma que se repite en mi actividad principal

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, solo muestro la notificación en la barra de estado y configuro la bandera como 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?

Call cancel() en AlarmManager con un PendingIntent equivalente al que setRepeating() 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); 

Intenté varios métodos y no pude hacer que funcionara, así que decidí hacer un truco sucio. Cuando quiero cancelar mi alarma de repetición, 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 verdadero, crea una alarma que sustituye y luego cancela la que tiene el mismo 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); } 

En su MainActivity , configure la hora de la alarma. Si va a usar varias alarmas, use SharedPreferences para almacenar sus respectivos ID. 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 use la misma ID de 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(); 
    Intereting Posts