Ежедневная работа в определенное время для Android 8.0+ - PullRequest
0 голосов
/ 28 августа 2018

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы можете просто использовать 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>()
 nextWorkRequest.withInitialDelay(24, TimeUnit.HOURS)
 WorkManager.getInstance().enqueue(firstWorkRequest)

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

0 голосов
/ 24 мая 2019

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

0 голосов
/ 28 августа 2018

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

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

, где workA равно OneTimeWorkRequest и workB равно PeriodicWorkRequest

...