在广播接收器上运行协程函数

问题描述 投票:0回答:2

我正在制作一个闹钟应用程序,并使用 AlarmManager 设置闹钟。 在 AlarmManager 上运行 setAlarm 后,我使用 Room 保存每个闹钟,这样如果手机关闭,我可以稍后恢复它们。

我在设备启动后使用 Android 开发者网站的指南运行 BroadcastReceiver:https://developer.android.com/training/scheduling/alarms#boot

我的想法是通过 onReceive 方法从 Room 获取警报 但是 Room 使用暂停乐趣来获取警报,但我无法在 onReceive 上运行它,因为 BroadcastReceiver 没有生命周期

我怎样才能达到类似的结果?

android kotlin broadcastreceiver coroutine
2个回答
20
投票

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 }
    

0
投票
你可以这样做:

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() } } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.