Как составить график уведомлений с помощью WorkManager?

Я хочу планировать уведомление каждый раз, когда пользователь добавляет заметку в базу данных на определенное время. Хотя есть несколько способов сделать это с помощью AlarmManager, BroadcastReceiver и т. Д. Как это можно сделать с помощью WorkManager?

5 ответов

Решение

WorkManager не подходит для работы, которая должна происходить в определенное время.

Вы должны использовать AlarmManagerи, в частности, AlarmManagerCompat.setExactAndAllowWhileIdle (), чтобы получить обратный вызов в определенное время.

Вы можете показать уведомление с помощью workmanager. Workmanger может быть использован для планирования одной задачи вхождения или периодической задачи вхождения, а также для планирования задачи в определенное время.

OneTimeWorkRequest request= new OneTimeWorkRequest.Builder(CustomWorkerClass.class)
.setInitialDelay(delayedTime, TimeUnit.MILLISECONDS)
.addTag("TAG")
.build();

'delayedTime' -> рассчитать время, когда нужно активировать уведомление

для более подробной информации нажмите здесь. Чтобы узнать больше о workmanager, нажмите здесь

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

Вы можете получить значения календаря, подобные этому,

      val timePicker = your timepicker here
val calendar: Calendar = Calendar.getInstance()
val nowMillis = calendar.timeInMillis

а затем вы можете настроить своего работника для конкретной задачи, как показано ниже,

      calendar.set(calendar.get(Calendar.YEAR),
         calendar.get(Calendar.MONTH),
         calendar.get(Calendar.DAY_OF_MONTH),
         timePicker.hour,
         timePicker.minute)
val difference = calendar.timeInMillis - nowMillis
val alarmRequest = OneTimeWorkRequest
            .Builder(AlarmWorker::class.java)
            .setInitialDelay(difference, TimeUnit.MILLISECONDS).build()
WorkManager.getInstance(this).enqueue(alarmRequest)

Согласно официальной документации Android о менеджере работника: "Эти API позволяют создавать задачи и передавать их в WorkManager для немедленного запуска или в подходящее время". В моем приложении я настроил активацию работы через 20 секунд после:

 // Schedule the time
 val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
    WorkManager.getInstance().enqueue(request)

Как сказал Янханнибаллейк

WorkManager не подходит для работы, которая должна выполняться в определенное время.

Но это может быть установлено в ближайшем будущем точного времени, в зависимости от состояния оптимизации батареи.

Обходной путь будет таким:

// Time to show notification at
LocalDateTime timeAt = LocalDate.now().atTime(20, 0);
LocalDateTime timeNow = LocalDateTime.now();

OneTimeWorkRequest.Builder workBuilder = new OneTimeWorkRequest.Builder(NotificationWorker.class);
// I just need to set an delay here
workBuilder.setInitialDelay(Duration.between(timeNow, timeAt));

// This is just to complete the example
WorkManager.getInstance().enqueueUniqueWork(UNIQUE_WORK_SHOW_NOTIFICATION,
                                    ExistingWorkPolicy.REPLACE,
                                    workBuilder.build());
Другие вопросы по тегам