Несколько OneTimeWorkRequests с задержкой в ​​виде цепочки - PullRequest
0 голосов
/ 07 июня 2018

Я создаю приложение «Напоминание о медицине», которое должно напоминать о потреблении лекарств на основе дат и часов, сохраненных в базе данных.Напоминание должно происходить в форме уведомления.Давайте предположим, что у меня есть одно лекарство, которое нужно употреблять дважды (для быстрого тестирования, например, в 9:50 вечера и 9:55 вечера).Уведомления запускаются нажатием кнопки.

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

Это мой код:

public void makeNotifications(Date now, String[] medicineNames, Date[] 
takingTime) {

    WorkContinuation continuation = null;

    for (int i = 1; i < medicineNames.length + 1; i++) {

        Data.Builder dataBuilder = new Data.Builder()
                .putString(MEDICINE_NAME_KEY, medicineNames[i - 1])
                .putLong(MEDICINE_TAKING_TIME_KEY, takingTime[i - 1].getTime());
        OneTimeWorkRequest.Builder requestBuilder =
                new OneTimeWorkRequest.Builder(NotificationWorker.class)
                        .setInputData(dataBuilder.build());

        if (i == 1) {
            long diff = Math.abs(takingTime[i - 1].getTime() - now.getTime());
            requestBuilder.setInitialDelay(diff, TimeUnit.MILLISECONDS);
            continuation = mWorkManager.beginUniqueWork(
                    MEDICINE_NOTIFICATION_KEY,
                    ExistingWorkPolicy.KEEP,
                    requestBuilder.build());
        } else {
            long diff = Math.abs(takingTime[i - 1].getTime() - now.getTime());
            requestBuilder.setInitialDelay(diff, TimeUnit.MILLISECONDS);
            continuation.then(requestBuilder.build());
        }
    }
    continuation.enqueue();
} 

Есть ли у вас какие-либо предложения /объяснение / решение

1 Ответ

0 голосов
/ 23 июня 2018

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

Я бы рекомендовал вам использовать AlarmManager вместо этого.Либо используйте setAndAllowWhileIdle() или setExactAndAllowWhileIdle() AlarmManager

На основе документации :

Стандартные тревоги AlarmManager (включая setExact () и setWindow ())отложены до следующего окна обслуживания.

  • Если вам нужно установить сигналы тревоги, которые срабатывают в режиме Doze, используйте setAndAllowWhileIdle () или setExactAndAllowWhileIdle ().
  • Сигналы тревоги, установленные с помощью setAlarmClock ()продолжайте работать в обычном режиме - система выйдет из режима сна незадолго до того, как сработают эти тревоги.
...