Android Implement LifecycleOwner for WorkManager

May 13, 2019

WorkManager runs in background thread, while LifecycleOwner/LiveData require main/ui thread, thus it is highly not recommended.

If you really must …

The sample below utilize CoroutineWorker

class ReminderWorker(appContext: Context, workerParams: WorkerParameters): CoroutineWorker(appContext, workerParams), LifecycleOwner {
    companion object {
        fun run() : LiveData<WorkInfo> {
            val work = OneTimeWorkRequestBuilder<ReminderWorker>().build()
            WorkManager.getInstance().enqueue(work)

            return WorkManager.getInstance().getWorkInfoByIdLiveData(work.id)
        }
    }


    private lateinit var lifecycleRegistry: LifecycleRegistry

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }

    override suspend fun doWork(): Result = coroutineScope {
        val worker = this@ReminderWorker

        lifecycleRegistry = LifecycleRegistry(worker)
        lifecycleRegistry.currentState = Lifecycle.State.CREATED

        val lifecyclerOwner = work
        // test if Lifecycle.Event.ON_DESTROY is called
        lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            fun onDestroy() {
                Timber.d("onDestroy")
            }
        })

        lifecycleRegistry.currentState = Lifecycle.State.STARTED

        // do something

        lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
        Result.success()
    }
}

References:

This work is licensed under a
Creative Commons Attribution-NonCommercial 4.0 International License.