Есть много способов достичь этого.В любом случае, всем им нужна одна общая вещь - база данных.Это легко понять, вам нужна база данных для хранения такой информации, как:
- будильник действителен (например, или должен быть выключен, как в приложении «Часы»)
- когда он должен быть запущен (например, вы перезапускаете устройство и запускаетеобслуживание через
onBootReceived
и необходимо проверить, нужно ли ему планировать новые тревоги или нет)
Теперь немного поговорим о PendingIntent
Если вы планируете тревогу с тем же PendingIntent
- что я имею в виду, намерение, передаваемые данные, код запроса и действие одинаковы, каждый старый сигнал тревоги после настройки нового будет отменен и отменен.Чтобы избежать этого, вы должны передавать URI каждому создаваемому вами сигналу тревоги.Uri
вы можете просто взять из базы данных.
Пример:
Вы хотите назначить будильник, который сработает PendingIntent
в 17:00, 20:00 и на следующий день в 10:00.Предположим, что вы решили использовать setRepeating()
Вместо установки сигналов тревоги 3 раза с помощью setExactAndAllowWhileIdle()
.То, что вы должны сделать, это передать в базу данных эти 3 указанных времени и календарные дни, установить интервал срабатывания каждые 3 часа, и каждый раз, когда срабатывает сигнализация, он должен проверять в базе данных, наступило ли время срабатывания сигнализации или нет.В этом случае вы будете вызывать больше пробуждений (каждые 3 часа), но вы будете уверены, что ваш будильник сработает.
Может быть, я не очень четко описал это, но я надеюсь, вы поймете.Я также предоставлю некоторые ссылки, где я описал, как установить эти тревоги и как AlarmManagers
видит PendingIntent
с.:
Планирование запуска задачи каждые 24 часа
Редактирование запланированных ожидающих намерений