我需要一些帮助来了解何时我可以预期我的广播接收器只能在清单中注册而不必从正在运行的活动或服务进行注册.
因此,例如,如果我使用以下intent过滤器注册一个独立的接收器,它可以在没有服务/活动引用的情况下工作:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.blk_burn.standalonereceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name="TestReceiver">
<intent-filter>
<action android:name="android.media.AUDIO_BECOMING_NOISY"/>
</intent-filter>
</receiver>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
但是如果我更换android.media.AUDIO_BECOMING_NOISY与android.intent.action.HEADSET_PLUG接收器没有被触发(Android文档)
根据我在本网站上发现的内容,您必须从已经运行的活动或服务中注册此接收器(Post).
任何人都可以告诉我为什么这只是在清单中调整你的意图过滤器以及为什么你需要在后台运行引用/注册接收器的服务?
是否有一个解决方法,以便我可以使用意图过滤器在我的应用程序的清单中注册我的接收器android.intent.action.HEADSET_PLUG?
如何识别Android文档中哪些广播操作需要有服务或活动注册它们而不是在清单中使用正确的过滤器?
我正在构建一个需要 Radar.io SDK 某些功能的应用程序,因此我决定创建插件,以便在该项目结束后我可以与 Flutter 社区的其他成员共享该插件。问题是,我无法接收此插件中的事件。这对于插件很重要,因为为了接收地理定位触发器和其他后台事件等事件,该接收器需要接收实时信息。
我已经成功实现了https://radar.io/documentation/sdk中的 Android SDK(使用 Kotlin)中的每个功能,但是,当事件发生时,接收器不会被调用。我知道设备正在被跟踪,因为 Radar.io 仪表板中的位置已更新,但是,当发生各种事件时,接收器根本不会执行。
以下是文档告诉您如何在清单中注册接收器的方法。
<receiver
android:name=".MyRadarReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="io.radar.sdk.RECEIVED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这适用于标准应用程序,但是,当我在清单中注册接收器时,应用程序不会在接收器所在的插件目录中查找。相反,它会查找应用程序 android 目录并返回无法找到数据路径的错误。这会导致应用程序终止。
为了解决这个问题,我发现可以通过编程方式设置接收器,所以我决定尝试一下。
在插件的主 Kotlin 文件中,我编写了以下几行以在registerWith和onAttachedToEngine. 据我了解,这些基本上是 onStart 函数。registerWith是为了与旧设备兼容而保留的旧功能。
val myRadarReceiver = MyRadarReceiver()
val intentFilter = IntentFilter()
intentFilter.addAction("io.radar.sdk.RECEIVED")
ContextWrapper(this.context).registerReceiver(myRadarReceiver, intentFilter)
Run Code Online (Sandbox Code Playgroud)
引用的类是SDK 中类MyRadarReceiver()的扩展,它扩展意味着这是我的广播接收器。这是课程:RadarReceiverBroadcastReceiver
public class MyRadarReceiver: RadarReceiver() {
override fun onEventsReceived(context: Context, events: Array<RadarEvent>, user: RadarUser) {
println("test: " + "an event was received") …Run Code Online (Sandbox Code Playgroud)