Я реализовал AlarmManager
для отправки уведомлений, когда пользователь добавляет срок выполнения к Задаче.Тем не менее, когда пользователь выключает устройство, все тревоги теряются.Теперь я обновляю BroadcastReceiver
, чтобы получить android.intent.action.BOOT_COMPLETED
и переназначаю все аварийные сигналы, установленные для каждой задачи.
Моя первая попытка состояла в том, чтобы получить Rx Single
со всеми задачами, срок выполнения которых составляетвыше текущего времени внутри BroadcastReceiver
, затем перепланируйте все аварийные сигналы.Проблема в том, что я не могу утилизировать Observable
, если у BroadcastReceiver
нет жизненного цикла.Кроме того, кажется, что это не очень хороший подход .
Во время моих исследований IntentService
был хорошим решением для этого случая, но я вхожу в новый WorkManager
библиотека и OneTimeWorkRequest
выглядит как хорошее и простое решение.
Worker
вызывается и выполняется правильно, но я не могу утилизировать Observable
, потому что метод onStopped
никогда не вызывается.
Вот реализация, основанная на этом фрагменте :
class TaskAlarmWorker(context: Context, params: WorkerParameters) :
Worker(context, params), KoinComponent {
private val daoRepository: DaoRepository by inject()
private val compositeDisposable = CompositeDisposable()
override fun doWork(): Result {
Timber.d("doWork")
val result = LinkedBlockingQueue<Result>()
val disposable =
daoRepository.getTaskDao().getAllTasks().applySchedulers().subscribe(
{ result.put(Result.SUCCESS) },
{ result.put(Result.FAILURE) }
)
compositeDisposable.add(disposable)
return try {
result.take()
} catch (e: InterruptedException) {
Result.RETRY
}
}
override fun onStopped(cancelled: Boolean) {
Timber.d("onStopped")
compositeDisposable.clear()
}
}
- Является ли
WorkManager
хорошим решением для этого случая? - Можно ли правильно расположить
Observable
?