android 在广播接收机上运行协同程序功能

41zrol4v  于 2023-02-02  发布在  Android
关注(0)|答案(2)|浏览(90)

我正在制作一个闹钟应用程序,并使用AlarmManager来设置闹钟。我在AlarmManager上运行SetAlarm后使用Room保存了每个闹钟,这样我就可以在以后手机关机和关机时恢复它们。
我运行一个BroadcastReceiver后,设备启动使用指南从Android开发人员网站:https://developer.android.com/training/scheduling/alarms#boot
我的想法是在onReceive方法上从Room获取警报,但是Room使用了一个suspend函数来获取警报,但是我无法在onReceive上运行它,因为BroadcastReceiver没有生命周期
我怎样才能达到类似的结果呢?

7gs2gvoe

7gs2gvoe1#

BroadcastReceiver文档中的本节提供了如何执行此操作的示例。
你可以用一个扩展函数来稍微清理一下:

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

然后在你的接收器中,你可以像下面这样使用它。goAsync块中的代码是一个协程。记住你不应该在这个协程中使用Dispatchers.Main

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

pgvzfuti2#

你可以这样做:

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()
                }
            }
        }
    }

相关问题