Я хочу создать службу (?), Которая запускается / регистрируется после установки приложения и сохраняет элементы мониторинга, хранящиеся в массиве. Эти элементы являются продуктами с датами истечения срока годности, поэтому, если сегодня день истечения срока действия, я хочу показать уведомление об этом независимо от того, запущено ли приложение в данный момент или нет.
Я уже поискал ответ в Интернете и на сайте разработчиков Android, и вот что я узнал:
Я не знаю, как это сделать:
В общем, я знаю основы и то, как это должно работать, но мне не хватает концепции, как это реализовать, чтобы это было эффективно.
Спасибо за все ответы! :)
// РЕДАКТИРОВАТЬ
Некоторый код моей пользовательской службы на данный момент:
class ExpiryMonitorService : Service() {
private val productsArray: ArrayList<ProductEntry> = ArrayList()
// Binder which will be given to clients
private val mBinder: IBinder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService() : ExpiryMonitorService {
// Return this instance of ExpiryMonitorService so clients can call public methods
return this@ExpiryMonitorService
}
}
override fun onBind(intent: Intent?): IBinder {
return mBinder
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return START_STICKY // Restart this service if it gets killed by the system
}
}
Ответ - не услуга. Его AlarmManager (или JobScheduler) установлен для истечения срока действия от закрытия до истечения срока действия, а также база данных элементов и дат истечения срока действия. Когда задание завершается, оно отправляет уведомление и планирует следующую тревогу / задание на основе данных в базе данных.
Сервис - это не ответ, потому что сервис может быть отключен в любой момент из-за ресурсов. Кроме того, в современных версиях Android у Службы есть ограничения на то, сколько фоновой обработки она может выполнять перед тем, как быть убита. Ни то, ни другое не может служить хорошим решением для мониторинга. К счастью, вам на самом деле не нужен мониторинг, вам просто нужно быть предупрежденным в определенное время, что идеально подходит для будильника.
@BartoszKubacki Эти двое выполняют одну и ту же роль, но JobScheduler новее и с ним проще работать. Просто в старых телефонах этого не будет. Они позволяют запланировать пробуждение вашего приложения и запуск определенного BroadcastReceiver в заданное время (с множеством дополнительных опций в JobScheduler, которые упрощают его использование).
Я считаю, что успешно реализовал решение с помощью JobSheduler, но я не могу найти хороший способ запланировать мероприятие в определенное время один раз в день, скажем, в 8 утра. Я не прав или это надо делать с помощью Alarm Manager?
Для этого достаточно @BartoszKubacki JobScheduler. Должен быть периодический вариант. Или, в худшем случае, одно задание может планировать следующее.
может ты и прав, но как это реализовать? Периодическая работа будет выполняться с определенным интервалом, но, например, если я запланирую задачу с 24-часовым интервалом, я не могу контролировать, в какое именно время она будет выполняться, особенно если устройство тем временем перезагружается. AlarmManager, кажется, здесь реальный ответ, поскольку он дает возможность указать точное время, когда задача должна быть выполнена.
Спасибо, это тот ответ, который я искал. :) Я постараюсь реализовать это либо с помощью AlarmManager, либо с JobSheduler, в зависимости от моих потребностей (мне нужно сначала проверить, что это: D) и при необходимости задать любые вопросы.