我正在使用 Jetpack Compose 对 Android API 26 进行一些实验,但在同一可组合项中发送和接收广播时遇到了问题。 这是我的接收器的代码:
class ImpReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.i("Implicit Broadcast", intent.extras?.getString("message") ?: "None")
}
}
这是注册代码:
val context = LocalContext.current
DisposableEffect(Unit) {
val receiver = ImpReceiver()
context.registerReceiver(
receiver,
IntentFilter("example.ImpBroadcast"),
RECEIVER_NOT_EXPORTED
)
Log.i("Receiver", "Implicit receiver registered")
onDispose {
context.unregisterReceiver(receiver)
Log.i("Receiver", "Implicit receiver disposed")
}
}
这是发送广播的代码:
Intent()
.apply {
action = "example.ImpBroadcast"
putExtra("message", "Implicit receiver called!")
}
.let { context.sendBroadcast(it) }
问题是,当我在注册接收器时使用 RECEIVER_NOT_EXPORTED 标志时,我没有收到广播(即,我没有收到日志)。但是,当我将标志更改为 RECEIVER_EXPORTED 时,它会按预期工作。这很令人困惑,因为这两段代码位于相同的可组合项中,并且应该在相同的上下文中运行。
我已经搜索了一段时间,但仍然找不到任何有用的东西。谁能帮助我理解为什么会发生这种情况?任何帮助将不胜感激。
我也面临同样的问题,解决方案不是使用上下文来注册和取消注册接收者
只需更改您的代码 来自
context.registerReceiver(receiver, IntentFilter(Constants.BroadcastActions.NAVIGATION))
context.sendBroadcast(intent)
至
LocalBroadcastManager.getInstance(context).registerReceiver(
receiver, IntentFilter(Constants.BroadcastActions.NAVIGATION)
)
LocalBroadcastManager.getInstance(context).sendBroadcast(intent)