Почему PendingIntent стреляет? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь отправить уведомления в определенные c дней. Мой метод "setNextNotification" планирует следующее уведомление с помощью AlarmManager.

Java API времени используется для проверки текущего дня. Если он равен вторнику, в ZonedDateTime добавляется день, и для этого дня устанавливается будильник. Это по крайней мере то, что я пытаюсь сделать sh.

Сегодня вторник, и все равно отправляется уведомление.

Чего мне не хватает?

private static void setNextNotification(Context context) {
        LocalDateTime ldt = LocalDateTime.now();
        ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Stockholm"));
        DayOfWeek dayOfWeek = zdt.getDayOfWeek();

        Intent intent = new Intent(context, ReminderReceiver.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        if(dayOfWeek.getValue() == 2){
            zdt.plusDays(1);
            alarmManager.set(AlarmManager.RTC_WAKEUP, zdt.toInstant().toEpochMilli(), alarmIntent);
        }

    }

1 Ответ

0 голосов
/ 28 апреля 2020

ZonedDateTime является неизменным представлением даты и времени с часовым поясом. Таким образом, даже если вы вызвали plusDays(1), исходное время в ZoneDateTime объекте остается неизменным.

plusDays() возвращает новый объект ZonedDateTime с измененным значением. Который в вашем коде вы нигде не назначаете. Поэтому вам нужно заменить

zdt.plusDays(1); на zdt = zdt.plusDays(1);

, чтобы он работал так, как вы предполагали.

Модифицированный код:

private static void setNextNotification(Context context) {
        LocalDateTime ldt = LocalDateTime.now();
        ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Stockholm"));
        DayOfWeek dayOfWeek = zdt.getDayOfWeek();

        Intent intent = new Intent(context, ReminderReceiver.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        if(dayOfWeek.getValue() == 2){
            zdt = zdt.plusDays(1);
            alarmManager.set(AlarmManager.RTC_WAKEUP, zdt.toInstant().toEpochMilli(), alarmIntent);
        }

}
...