Из моего собственного приложения, которое я разрабатываю, если будильник установлен на время, когда телефон выключен, он был запущен при следующем включении / загрузке телефона. Это без получателя для присутствия BOOT_COMPLETED. Я не уверен, является ли это ожидаемым поведением или нет, или оно является последовательным по телефонным вариантам.
Я полагаю, что если вы хотите, чтобы ваша сигнализация выполняла намерение в указанное время, вам нужно использовать getBroadcast PendingIntent с WakeLock, поскольку другие варианты PendingIntent не гарантируют, что телефон будет оставаться активным достаточно долго, прежде чем он выключится. снова. Это информация из другого поста CommonsWare, которую я постараюсь найти и сослаться на нее.
Я полагаю, что вы можете удалить отложенный запрос, отправленный диспетчеру аварийных сигналов, используя, например, такую функцию:
public void unregisterEvent(PendingIntent sender) { ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).cancel(sender);
}
где PendingIntent был создан в точности как исходное намерение, которое вы пытаетесь удалить. Вы можете обновить его, указав правильный идентификатор вместе с новым PendingIntent при повторном вызове AlarmManager:
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
Это то, что я использую для создания / перестройки PendingIntent:
PendingIntent.getService(this, uniqueIndexToIntent, theIntentItself, PendingIntent.FLAG_UPDATE_CURRENT);
Флаг обновит намерение, если оно уже существует, или создаст новое, в противном случае.