ОБНОВЛЕНИЕ: Это работает для нас в Prod, но это не 100%. Я получил один отчет о сбое за последние полтора месяца, в противном случае было бы более сотни. Пока это не исправлено, это кажется нашим лучшим вариантом на данный момент. Может быть, если бы я поднял время больше 300, то такого сбоя никогда бы не произошло?
Мы сейчас тестируем это, которое, похоже, работает. Будет обновляться, как мы видим больше результатов
class ResumingServiceManager(val lifecycle: Lifecycle) : LifecycleObserver {
init {
lifecycle.addObserver(this)
}
val disposable: CompositeDisposable = CompositeDisposable()
fun startService(context: Context, intent: Intent) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
context.startService(intent)
} else {
Single.just(true)
.delaySubscription(300, TimeUnit.MILLISECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onSuccess = {
context.startService(intent)
}
).addTo(disposable)
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stopped() {
disposable.clear()
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun destroy() {
lifecycle.removeObserver(this)
}
}
В onCreate()
инициализируйте его, а затем в любое время, когда вы хотите запустить службу в onResume, просто позвоните resumingServiceManager.startService(this, intent)
Он осведомлен о жизненном цикле, поэтому он удалит одноразовые, если остановится, отменив запуск onSuccess, когда он может оказаться на пути к фону с немедленным открытием / закрытием.