Android: obtenga todos los PendingIntents configurados con AlarmManager

Estoy configurando una alarma como esta:

alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingEvent); 

Estoy interesado en eliminar todas las alarmas que se establecieron anteriormente, borrarlas.

¿Hay alguna forma de hacerlo o de obtener todas las alarmas actualmente configuradas para poder eliminarlas manualmente?

Debes crear tu bash pendiente y luego cancelarlo

  AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class); PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0); // Cancel alarms try { alarmManager.cancel(pendingUpdateIntent); } catch (Exception e) { Log.e(TAG, "AlarmManager update was not canceled. " + e.toString()); } 

No tiene que mantener referencia a eso. Simplemente defina un nuevo PendingIntent como exactamente el que definió al crearlo.

Por ejemplo:

si creé un PendingIntent para ser disparado por el AlarmManager de esta manera:

  Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class); alarmIntent.setData(Uri.parse("custom://" + alarm.ID)); alarmIntent.setAction(String.valueOf(alarm.ID)); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0); alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDateTime, displayIntent); 

Luego, en algún lugar de tu otro código (incluso otra actividad) puedes hacer esto para cancelar:

 Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class); alarmIntent.setData(Uri.parse("custom://" + alarm.ID)); alarmIntent.setAction(String.valueOf(alarm.ID)); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0); alarmManager.cancel(displayIntent); 

Lo importante aquí es configurar el PendingIntent con exactamente los mismos datos y acciones, y otros criterios, como también se indica aquí http://developer.android.com/reference/android/app/AlarmManager.html#cancel%28android.app .PendingIntent% 29

Para cancelar una alarma, no necesita volver a crear el mismo PendingIntent y pasar el mismo código de solicitud.

Por lo tanto, he creado AlarmUtits para ayudarme a guardar todos los códigos de solicitud en las preferencias para cancelarlos en el futuro si es necesario. Todo lo que necesita es usar la siguiente clase y llamar a los siguientes métodos:

  • addAlarm para agregar una nueva alarma y pasar un código de solicitud.
  • cancelAlarm para eliminar una alarma, necesita volver a crear la misma
    Propósito y pasar el mismo código de solicitud.
  • hasAlarm para verificar si esa alarma se agregó, necesita volver a crear el mismo Intento y pasar el mismo código de solicitud.
  • cancelAllAlarms para eliminar TODAS las alarmas configuradas.

Mi AlarmUtils

 public class AlarmUtils { private static final String sTagAlarms = ":alarms"; public static void addAlarm(Context context, Intent intent, int notificationId, Calendar calendar) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else { alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } saveAlarmId(context, notificationId); } public static void cancelAlarm(Context context, Intent intent, int notificationId) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); removeAlarmId(context, notificationId); } public static void cancelAllAlarms(Context context, Intent intent) { for (int idAlarm : getAlarmIds(context)) { cancelAlarm(context, intent, idAlarm); } } public static boolean hasAlarm(Context context, Intent intent, int notificationId) { return PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_NO_CREATE) != null; } private static void saveAlarmId(Context context, int id) { List idsAlarms = getAlarmIds(context); if (idsAlarms.contains(id)) { return; } idsAlarms.add(id); saveIdsInPreferences(context, idsAlarms); } private static void removeAlarmId(Context context, int id) { List idsAlarms = getAlarmIds(context); for (int i = 0; i < idsAlarms.size(); i++) { if (idsAlarms.get(i) == id) idsAlarms.remove(i); } saveIdsInPreferences(context, idsAlarms); } private static List getAlarmIds(Context context) { List ids = new ArrayList<>(); try { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); JSONArray jsonArray2 = new JSONArray(prefs.getString(context.getPackageName() + sTagAlarms, "[]")); for (int i = 0; i < jsonArray2.length(); i++) { ids.add(jsonArray2.getInt(i)); } } catch (Exception e) { e.printStackTrace(); } return ids; } private static void saveIdsInPreferences(Context context, List lstIds) { JSONArray jsonArray = new JSONArray(); for (Integer idAlarm : lstIds) { jsonArray.put(idAlarm); } SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putString(context.getPackageName() + sTagAlarms, jsonArray.toString()); editor.apply(); } }