Android: получить все PendingIntents набор с AlarmManager
Я устанавливаю будильник вот так:
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingEvent);
Я заинтересован в удалении всех тревог, которые ранее были установлены, очистив их.
есть ли способ для меня сделать это или получить все сигналы тревоги, которые в настоящее время установлены, чтобы я мог удалить их вручную ?
3 ответа:
вам нужно создать ожидающее намерение, а затем отменить его
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()); }
вы не должны держать ссылку на него. Просто определите новый PendingIntent, как точно тот, который вы определили при его создании.
например:
Если я создал PendingIntent, который будет уволен AlarmManager следующим образом:
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);
затем где-то в другом коде (даже другим видом деятельности) вы можете сделать это отменить:
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);
здесь важно установить PendingIntent с точно такими же данными и действием, и другие критерии, а также изложенные здесь http://developer.android.com/reference/android/app/AlarmManager.html#cancel%28android.app.PendingIntent%29
чтобы отменить тревогу, вам не нужно повторно создавать тот же PendingIntent и передавать тот же код запроса.
Итак, я создал AlarmUtits, чтобы помочь мне сохранить все коды запросов в настройках, чтобы отменить его в будущем, если это необходимо. Все, что вам нужно, это использовать следующий класс и вызвать следующие методы:
addAlarm
чтобы добавить новый сигнал тревоги и передать код запроса.cancelAlarm
чтобы удалить сигнал тревоги, необходимо повторно создать то же самое
Намерение и передать тот же код запроса.hasAlarm
чтобы проверить, если этот сигнал тревоги, как добавлено, необходимо повторно создать то же самое намерение и передать тот же код запроса.cancelAllAlarms
для удаления всех установленных сигналов тревоги.Мои 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(); } }