Ежедневная работа в определенное время для Android 8.0+

Я пытался выяснить, как использовать любой из API-интерфейсов фоновых задач, чтобы создать рабочий запрос, который срабатывает каждый день в определенное время дня на устройствах под управлением Android 8.0+. Время должно быть установлено пользователем локально на устройстве (что означает отсутствие GCM).

Это вообще возможно? Устаревшие устройства с AlarmManager творят чудеса, но, насколько я знаю, все ожидающие намерения очищаются, когда приложение принудительно останавливается, так что сейчас это не нужно.

PeriodicWorkRequest WorkManager не позволяет установить время начала Работы. Я пытался создать отложенный OneTimeWorkRequest и запланировать следующий после его запуска, но ничто не гарантирует, что работа будет выполняться в нужное мне время.

В библиотеке Evernote Android-Job тоже есть проблемы с DailyJob (https://github.com/evernote/android-job/issues/318).

Любые предложения/идеи более чем приветствуются.


person Alex Styl    schedule 28.08.2018    source источник
comment
если вы хотите, чтобы ваша работа выполнялась в определенное время в Android 8, используйте alarmManager с setInexact.   -  person Dr. aNdRO    schedule 28.08.2018
comment
@Dr.aNdRO Я пробовал это, но когда вы «Принудительно останавливаете» приложение, ожидающее намерение исчезает, и приложение не просыпается.   -  person Alex Styl    schedule 28.08.2018
comment
Когда пользователь устанавливает его локально, вы можете запланировать его с помощью FCM, верно? Только в этом случае вы будете получать оповещения вовремя, если вы нацелились на ›=8. Поскольку WorkManager устанавливает будильник не на это конкретное время, а близко к нему.   -  person Dr. aNdRO    schedule 28.08.2018
comment
Только без сервера. Только код, который работает на устройстве. ФКМ не вариант.   -  person Alex Styl    schedule 28.08.2018
comment
проверьте этот проект, он делает то же самое. github.com/cyph3rcod3r/Alliance без FCM и для Android 8   -  person Dr. aNdRO    schedule 28.08.2018
comment
Если ваша задача не имеет особых требований, таких как длительное выполнение задания, разве диспетчер работ не гарантирует, что оно будет выполняться в нужное время?   -  person Umar Hussain    schedule 28.08.2018
comment
@UmarHussain Я только обнаружил, что вы можете установить начальную задержку для OneTimeWorkRequest, но не более того. Я что-то упускаю?   -  person Alex Styl    schedule 28.08.2018


Ответы (3)


Новые запросы PeriodicWorkRequest теперь поддерживают начальные задержки. Таким образом, вы берете необходимое время у пользователя, вычисляете разницу между userTime и Now и просто устанавливаете задержку. В отличие от AlarmManeger он очень надежен. Единственная проблема заключается в том, что Android запускает Worker, когда находит для него лучший момент (нет другой работы), поэтому он может запускаться с небольшой задержкой (обычно не более нескольких минут).

person MarkWalczak    schedule 24.05.2019

Вы можете просто использовать OneTimeWorkRequest, который планирует свою копию до того, как вернет Result.

class TestWorker: Worker() {
   fun doWork(): Result {
     val nextWorkRequest = OneTimeWorkRequestBuilder<TestWorker>()
     nextWorkRequest.withInitialDelay(24, TimeUnit.HOURS)
     WorkManager.getInstance().enqueue(nextWorkRequest)
     return Result.SUCCESS;
   }
}

Начните первый рабочий запрос с:

 val firstWorkRequest = OneTimeWorkRequestBuilder<TestWorker>()
 firstWorkRequest.withInitialDelay(24, TimeUnit.HOURS)
 WorkManager.getInstance().enqueue(firstWorkRequest)

Таким образом, вы получаете что-то похожее на PeriodicWorkRequest с нужным вам таймингом.

person Rahul    schedule 28.08.2018

Вы пытались использовать связанные задачи в WorkManager. Сначала запланируйте OneTimeWorkRequest, а затем свяжите его с PeriodicWorkRequest. Нравиться:

WorkManager.getInstance()
.beginWith(workA)
.then(workB) 

где workA — это OneTimeWorkRequest, а workB — это PeriodicWorkRequest.

person Prashanth Verma    schedule 28.08.2018
comment
Я знаю об API. Как бы вы использовали это, чтобы установить для него конкретное время? - person Alex Styl; 28.08.2018