自定义操作未触发上下文注册的接收器
Context-Registered Receiver not being triggered by Custom Action
我有一个问题:我的一个应用程序中的广播接收器没有通过我的服务从另一个应用程序发送的自定义操作广播触发其 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) }
}
}
}
尝试使用清单声明的接收器(例如,以防可能必须在此处添加权限):
<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
。
我有一个问题:我的一个应用程序中的广播接收器没有通过我的服务从另一个应用程序发送的自定义操作广播触发其 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) }
}
}
}
尝试使用清单声明的接收器(例如,以防可能必须在此处添加权限):
<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
。