В качестве способа реализации этого вы можете транслировать EventBus события через JobQueue задание, которое может повторить отправку события необходимое количество раз. Активность подписчика подписывается на это событие и создает ваше намерение только в том случае, если событие было обработано.
С точки зрения кода это может быть реализовано как:
Событие, которое будет транслироваться:
class SomeEvent(val isSuccess: Boolean)
Класс задания, экземпляр которого инициирован вашим сервисом:
class SendCustomEventJob() : Job{
@Inject
@Transient
lateinit var eventBus: EventBus
// dagger jobs component injection
override fun inject(appComponent: AppComponent) {
super.inject(appComponent)
appComponent.inject(this)
}
override fun onRun() {
// some logic goes here, like API calls
eventBus.post(SomeEvent(true))
}
override fun shouldReRunOnThrowable(throwable: Throwable, runCount: Int, maxRunCount: Int): RetryConstraint {
if(runCount == 3)
// your custom job exceptions handling logic
}
override fun getRetryLimit(): Int = 3 // your custom retries number
override fun onAdded() { }
override fun onCancel(cancelReason: Int, throwable: Throwable?) {
eventBus.post(SomeEvent(false))
}
}
И обработка событий в вашей активности-подписчике:
@Subscribe(threadMode = ThreadMode.MAIN)
fun onFetchedCustomEvent(event: SomeEvent) {
if (!event.isSuccess)
return
//create your intent here...
}