Как избежать переднего плана .ServiceStartNotAllowedException Операции повторной попытки для долгосрочных работников?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как избежать переднего плана .ServiceStartNotAllowedException Операции повторной попытки для долгосрочных работников?

Сообщение Anonymous »

У меня есть давний работник, который выполняет сетевые операции. Если сетевая ошибка происходит во время операций, работник останавливается с результатом Retry работника. Затем Android автоматически перезагружает работника после заданной задержки, если условия сети соответствуют. < /P>
Работник включен следующим образом: < /p>

Код: Выделить всё

val workRequest = PeriodicWorkRequestBuilder(
repeatInterval = 1L,
repeatIntervalTimeUnit = TimeUnit.HOURS,
)
.setConstraints(NetworkType.CONNECTED)
.addBackoffCriteria(30L)
.build()

WorkManager.getInstance(context)
.enqueueUniquePeriodicWork(
MyWorker.workerUniqueName,
ExistingPeriodicWorkPolicy.KEEP,
workRequest,
)
и setforegroundasync () вызывается перед выполнением давней работы внутри Dowork () работника.
< P> Я также следую руководящим принципам, описанным в Руководстве Android - поддержку долгосрочных работников. Тип службы переднего плана объявлен DataSync .
Учитывая, что работник начинается с 4G+Wi -Fi, когда WiFi отключен, тогда работник останавливается (с вышеупомянутой повторной задачей < /код> Результат работника). В этом случае, каждый раз, когда система пытается перезагрузить работника (политика повторной попытки), в то время как приложение находится на фоне, у меня есть следующее исключение в устройстве Android 14: < /p>
Moving WorkSpec (...) to the foreground
startForegroundService() not allowed due to mAllowStartForeground false: service com.myapp/androidx.work.impl.foreground.SystemForegroundService
android.app.ForegroundServiceStartNotAllowedException: startForegroundService() not allowed due to mAllowStartForeground false: service com.myapp/androidx.work.impl.foreground.SystemForegroundService
at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:54)
at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:50)
at android.os.Parcel.readParcelableInternal(Parcel.java:4870)
at android.os.Parcel.readParcelable(Parcel.java:4852)
at android.os.Parcel.createExceptionOrNull(Parcel.java:3052)
at android.os.Parcel.createException(Parcel.java:3041)
at android.os.Parcel.readException(Parcel.java:3024)
at android.os.Parcel.readException(Parcel.java:2966)
at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:5984)
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1931)
at android.app.ContextImpl.startForegroundService(ContextImpl.java:1906)
at android.content.ContextWrapper.startForegroundService(ContextWrapper.java:830)
at androidx.core.content.ContextCompat$Api26Impl.startForegroundService(ContextCompat.java:1189)
at androidx.core.content.ContextCompat.startForegroundService(ContextCompat.java:752)
at androidx.work.impl.Processor.startForeground(Processor.java:206)
at androidx.work.impl.utils.WorkForegroundUpdater$1.run(WorkForegroundUpdater.java:100)
at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
...
Moving WorkSpec (...) to the foreground
Work [ id=..., tags={ ...MyWorker } ] failed because it threw an exception/error
java.util.concurrent.ExecutionException: android.app.BackgroundServiceStartNotAllowedException: Not allowed to start service Intent { act=ACTION_NOTIFY cmp=com.myapp/androidx.work.impl.foreground.SystemForegroundService (has extras) }: app is in background uid UidRecord{... TRNB bg:+2m17s737ms idle change:procadj procs:0 seq(401644,401374)} caps=------
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:515)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:474)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:316)
at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
...
Worker result FAILURE for Work [ id=..., tags={ ...MyWorker } ]
Unable to stop foreground service
android.app.BackgroundServiceStartNotAllowedException: Not allowed to start service Intent { act=ACTION_STOP_FOREGROUND cmp=com.myapp/androidx.work.impl.foreground.SystemForegroundService }: app is in background uid UidRecord{... TRNB bg:+2m17s772ms idle change:procadj procs:0 seq(401644,401374)} caps=------
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1945)
at android.app.ContextImpl.startService(ContextImpl.java:1900)
at android.content.ContextWrapper.startService(ContextWrapper.java:825)
at androidx.work.impl.Processor.stopForegroundService(Processor.java:403)
at androidx.work.impl.Processor.cleanUpWorkerUnsafe(Processor.java:425)
at androidx.work.impl.Processor.onExecuted(Processor.java:345)
at androidx.work.impl.Processor.lambda$startWork$1$androidx-work-impl-Processor(Processor.java:179)
at androidx.work.impl.Processor$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0)
...

< /code>
В других случаях я проверил, где работник остановлен и перезапущен, пока приложение было в фоновом режиме, я не получил вышеупомянутое исключение. Вы хоть представляете, почему у меня есть это исключение, в этом случае и только в этом случае? Вы столкнулись с аналогичными проблемами?

Подробнее здесь: https://stackoverflow.com/questions/782 ... ion-for-lo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»