Home > Blockchain >  Run Coroutine functions on broadcast receiver
Run Coroutine functions on broadcast receiver

Time:10-19

Im making an Alarm app, and using AlarmManager to set alarms. Im saving every alarm using Room after running the setAlarm on the AlarmManager, so I can later restore them if the phone gets turned off and o .

Im running a BroadcastReceiver after the device gets booted using the guide from Android Developer site: https://developer.android.com/training/scheduling/alarms#boot

And my idea is to get the alarms from Room on the onReceive method But Room uses a suspend fun to get the alarms, but I cant run it on the onReceive since BroadcastReceiver doesnt have a lifecycle

How could I achieve a similar result?

CodePudding user response:

This section in the BroadcastReceiver documentation gives an example of how to do this.

You could clean it up a bit with an extension function:

fun BroadcastReceiver.goAsync(
    context: CoroutineContext = EmptyCoroutineContext,
    block: suspend CoroutineScope.() -> Unit
) {
    val pendingResult = goAsync()
    CoroutineScope(SupervisorJob()).launch(context) {
        try {
            block()
        } finally {
            pendingResult.finish()
        }
    }
}

Then in your receiver, you can use it like below. The code in the goAsync block is a coroutine. Remember that you should not use Dispatchers.Main in this coroutine.

override fun onReceive(context: Context, intent: Intent) = goAsync {
    val repo = MyRepository.getInstance(context)
    val alarms = repo.getAlarms() // a suspend function
    // do stuff
}
  • Related