Mam BroadcastReceiver
, który zmienia harmonogram alarmów w przypadku zdarzeń, takich jak ładowanie i zmiana czasu. Ale gdy minie czas wyzwalania alarmu (na przykład, gdy użytkownik ręcznie zmienia czas z ustawień), AlarmManager
uruchamia alarm natychmiast, zanim będę mógł dodać dzień, aby zmienić harmonogram alarmu. Jak mogę tego uniknąć?AlarmManager uruchamia alarmy w przeszłości bezpośrednio, zanim BroadcastReceiver może je zmienić.
Obecnie używam zestawu i dodaj metody Calendar
, aby zaplanować alarmy.
for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) {
if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek >= nowDay &&
!(dayOfWeek == nowDay && alarm.timeHour < nowHour) &&
!(dayOfWeek == nowDay && alarm.timeHour == nowHour && alarm.timeMinute <= nowMinute)) {
calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
alarmSet = true;
break;
}
}
if (!alarmSet) {
for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) {
if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek <= nowDay) {
calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
calendar.add(Calendar.WEEK_OF_YEAR, 1);
break;
}
}
}
Jest również powiedziane w docs:
Jeśli czas wyzwalania podanymi w przeszłości, alarm zostanie wyzwolony natychmiast.
Jak to zachowanie można zmienić?
Proponuję użyć JobScheduler, jak można pozbyć się problemu zamieszczonego
BroadcastReceiver
. – UMESH0492