Я использую 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 не запускается немедленно, если он был запланирован до закрытия приложения (даже если он соответствует всем ограничениям), не должны ли фоновые службы быть независимыми от контекста приложения?