BroadcastReceiver 未在 Android 中的同一可组合项中接收 Intent

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

我正在使用 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 时,它会按预期工作。这很令人困惑,因为这两段代码位于相同的可组合项中,并且应该在相同的上下文中运行。

我已经搜索了一段时间,但仍然找不到任何有用的东西。谁能帮助我理解为什么会发生这种情况?任何帮助将不胜感激。

kotlin android-jetpack-compose broadcastreceiver
1个回答
0
投票

我也面临同样的问题,解决方案不是使用上下文来注册和取消注册接收者

只需更改您的代码 来自

context.registerReceiver(receiver, IntentFilter(Constants.BroadcastActions.NAVIGATION))

context.sendBroadcast(intent)

LocalBroadcastManager.getInstance(context).registerReceiver(
            receiver, IntentFilter(Constants.BroadcastActions.NAVIGATION)
        )

LocalBroadcastManager.getInstance(context).sendBroadcast(intent)
© www.soinside.com 2019 - 2024. All rights reserved.