我正在制作一个闹钟应用程序,并使用 AlarmManager 设置闹钟。 在 AlarmManager 上运行 setAlarm 后,我使用 Room 保存每个闹钟,这样如果手机关闭,我可以稍后恢复它们。
我在设备启动后使用 Android 开发者网站的指南运行 BroadcastReceiver:https://developer.android.com/training/scheduling/alarms#boot
我的想法是通过 onReceive 方法从 Room 获取警报 但是 Room 使用暂停乐趣来获取警报,但我无法在 onReceive 上运行它,因为 BroadcastReceiver 没有生命周期
我怎样才能达到类似的结果?
BroadcastReceiver 文档中的部分提供了如何执行此操作的示例。
您可以使用扩展功能来清理它:
fun BroadcastReceiver.goAsync(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> Unit
) {
val pendingResult = goAsync()
CoroutineScope(SupervisorJob()).launch(context) { // This scope is intentionally global
try {
block()
} finally {
pendingResult.finish()
}
}
}
然后在您的接收器中,您可以像下面一样使用它。 goAsync
块中的代码是一个协程。请记住,您不应在此协程中使用
Dispatchers.Main
,它必须在 10 秒内完成。
override fun onReceive(context: Context, intent: Intent) = goAsync {
val repo = MyRepository.getInstance(context)
val alarms = repo.getAlarms() // a suspend function
// do stuff
}
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == "android.intent.action.BOOT_COMPLETED") {
CoroutineScope(Dispatchers.IO).launch {
try {
// you code here
} finally {
cancel()
}
}
}
}