Je règle une alarme comme celle-ci:
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingEvent);
Je suis intéressé à supprimer toutes les alarmes qui étaient précédemment définies, à les effacer.
Existe-t-il un moyen de le faire ou d'obtenir toutes les alarmes actuellement définies afin de pouvoir les supprimer manuellement?
Vous devez créer votre intention en attente, puis l'annuler
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());
}
Vous n'avez pas à y faire référence. Il vous suffit de définir un nouveau PendingIntent exactement comme celui que vous avez défini en le créant.
Par exemple:
si j'ai créé un PendingIntent à déclencher par AlarmManager comme ceci:
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);
Ensuite, quelque part dans votre autre code (même dans une autre activité), vous pouvez le faire pour annuler:
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);
L'important ici est de définir le PendingIntent avec exactement les mêmes données et actions, et d'autres critères ainsi qu'indiqués ici http://developer.Android.com/reference/Android/app/AlarmManager.html#cancel % 28Android.app.PendingIntent% 29
Pour annuler une alarme, vous devez recréer le même PendingIntent et transmettre le même code de demande.
J'ai donc créé un AlarmUtils pour m'aider à enregistrer tous les codes de demande dans les préférences pour l'annuler à l'avenir s'il en a besoin. Tout ce dont vous avez besoin est d'utiliser la classe suivante et d'appeler les méthodes suivantes:
addAlarm
pour ajouter une nouvelle alarme et transmettre un code de demande.cancelAlarm
pour supprimer une alarme, vous devez recréer la mêmehasAlarm
pour vérifier si cette alarme a été ajoutée, vous devez recréer la même intention et transmettre le même code de demande.cancelAllAlarms
pour supprimer TOUTES les alarmes réglées.My 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<Integer> idsAlarms = getAlarmIds(context);
if (idsAlarms.contains(id)) {
return;
}
idsAlarms.add(id);
saveIdsInPreferences(context, idsAlarms);
}
private static void removeAlarmId(Context context, int id) {
List<Integer> 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<Integer> getAlarmIds(Context context) {
List<Integer> 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<Integer> 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();
}
}