Как выполнить ожидающую / поставленную в очередь работу в WorkManager в Android - PullRequest
2 голосов
/ 05 августа 2020

Я использую WorkManager для запуска фоновой службы, когда пользователь перемещает приложение в фоновый режим или закрывает приложение (OneTimeRequest), вот мой код:

    public static void scheduleSessionAnalyticsWorker(Data inputData) {
            Constraints shouldBeConnected = new Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED)
                    .build();

            OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(AnalyticsWorker.class)
                    .addTag("WORKER_TAG")
                    .setInputData(inputData)
                    .setConstraints(shouldBeConnected)
                    .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 5, TimeUnit.SECONDS)
                    .build();

            WorkManager.getInstance(CoreApp.get().getBaseContext())
                    .enqueueUniqueWork("WORKER_TAG", ExistingWorkPolicy.KEEP, request);
   }

В случае перемещения приложения На заднем плане я ясно вижу, что WorkManager запущен и вызывается метод startWork()/ doWork().

Но в случае закрытия приложения работа успешно ставится в очередь, но никогда не выполняется!

Я уверен в том, что Работа помещена в очередь, потому что как только я повторно открываю приложение, я вызываю:

 List<WorkInfo> workInfos = WorkManager.getInstance(context).getWorkInfosByTag("WORKER_TAG").get();

И я вижу, что элементы списка имеют статус State.ENQUEUED .

Итак, есть ли способ запустить все ожидающие запросы после того, как пользователь повторно войдет в приложение?

И почему WorkManager не запускается немедленно, если он был запланирован до закрытия приложения (даже если он соответствует всем ограничениям), не должны ли фоновые службы быть независимыми от контекста приложения?

...