Изменение интервалов времени в Повторяющихся тревогах в AlarmManager - PullRequest
0 голосов
/ 18 октября 2018

Я смотрел на setRepeating(@AlarmType int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) метод AlarmManager и хочу решить вариант использования.

Вариант использования: я хочу установить повторяющиеся сигналы тревоги с различными значениями intervalMillis.Как я хочу показать уведомление через 2 часа, 5 часов и в 9 часов утра следующего дня.Или я хочу что-то делать каждый первый день месяца.

У меня есть два решения для этого.Либо я устанавливаю все тревоги одновременно, либо устанавливаю следующую тревогу при получении предыдущей тревоги (в случае, если ни одна из тревог больше не похожа на второй вариант использования).Проблема в том, что если пропущен сигнал тревоги, я не смогу инициировать дальнейшие сигналы тревоги, и вся цепочка разорвется.

Есть ли что-то, предоставленное Android для этого, если я пропустил его или не долженAndroid обеспечивает такую ​​гибкость?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Использование JobService .

1. Определенно срабатывает каждые 15 минут.Протестировано и используется в одном из наших приложений.2. Сохраните время первого запуска JobService.3. Проверьте разницу во времени от начала до настоящего момента и выполните действие.

0 голосов
/ 06 ноября 2018

Есть много способов достичь этого.В любом случае, всем им нужна одна общая вещь - база данных.Это легко понять, вам нужна база данных для хранения такой информации, как:
- будильник действителен (например, или должен быть выключен, как в приложении «Часы»)
- когда он должен быть запущен (например, вы перезапускаете устройство и запускаетеобслуживание через
onBootReceived и необходимо проверить, нужно ли ему планировать новые тревоги или нет)

Теперь немного поговорим о PendingIntent
Если вы планируете тревогу с тем же PendingIntent - что я имею в виду, намерение, передаваемые данные, код запроса и действие одинаковы, каждый старый сигнал тревоги после настройки нового будет отменен и отменен.Чтобы избежать этого, вы должны передавать URI каждому создаваемому вами сигналу тревоги.Uri вы можете просто взять из базы данных.

Пример:
Вы хотите назначить будильник, который сработает PendingIntent в 17:00, 20:00 и на следующий день в 10:00.Предположим, что вы решили использовать setRepeating() Вместо установки сигналов тревоги 3 раза с помощью setExactAndAllowWhileIdle().То, что вы должны сделать, это передать в базу данных эти 3 указанных времени и календарные дни, установить интервал срабатывания каждые 3 часа, и каждый раз, когда срабатывает сигнализация, он должен проверять в базе данных, наступило ли время срабатывания сигнализации или нет.В этом случае вы будете вызывать больше пробуждений (каждые 3 часа), но вы будете уверены, что ваш будильник сработает.

Может быть, я не очень четко описал это, но я надеюсь, вы поймете.Я также предоставлю некоторые ссылки, где я описал, как установить эти тревоги и как AlarmManagers видит PendingIntent с.:

Планирование запуска задачи каждые 24 часа
Редактирование запланированных ожидающих намерений

...