自定义操作未触发上下文注册的接收器

时间:2019-01-03 23:02:48

标签: android kotlin broadcastreceiver android-broadcast android-broadcastreceiver

我有一个问题:我的一个应用程序中的广播接收器没有通过我的服务从单独的应用程序发送的自定义操作广播触发其onReceive回调。

广播接收者为context-registered,这意味着我不想在清单文件中声明它,因为我不希望广播启动我的应用程序。广播是通过与应用程序完全独立的服务发送的,因此我们在此处处理进程间通信,而本地广播则不会。

我怀疑我的广播发送方(服务)中声明的意图操作字符串与广播接收方(应用程序)没有正确匹配。

看看下面的代码,我做错了什么?

ScannerService.kt

Intent().also { intent ->
    intent.action = "com.foo.bar.example.package.ScannerService.SCANNER_EVENT"
    intent.putExtra("barcode", barcode)
    intent.setPackage("com.nu.rms")
    sendBroadcast(intent)
    Timber.d("Sent broadcast")
}

AppActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    registerBroadcastReceivers()
}

private fun registerBroadcastReceivers() {
        val broadcastReceiver = ScannerBroadcastReceiver()
        val filter = IntentFilter().apply { addAction("SCANNER_EVENT") }
        registerReceiver(broadcastReceiver, filter)
        Timber.d("Registered broadcast receiver")
    }

class ScannerBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        Timber.d("Received broadcast")
        StringBuilder().apply {
            append("Action: ${intent.action}\n")
            append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
            toString().also { log -> Timber.d(log) }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

尝试使用清单声明的接收者(例如,如果可能必须在此处添加权限):

<receiver
    android:name=".ScannerBroadcastReceiver"
    android:permission="android.permission.INTERNET">
    <intent-filter>
        <action android:name="com.foo.bar.example.package.ScannerService.SCANNER_EVENT"/>
    </intent-filter>
</receiver>

在使用上下文注册的接收器时,操作可能是ScannerService.SCANNER_EVENT-甚至是冗长的com.foo.bar.example.package.ScannerService.SCANNER_EVENT