在 Android 8 上,清单声明的广播接收器不会接收自定义广播

Jos*_*hua 5 java android broadcast broadcastreceiver

首先,我创建了一个BroadcastReceiver空体。然后,我将其添加到 AndroidManifest.xml 中。但我发现BroadcastReceiver在清单中声明并没有收到任何广播。我通过以下方式发送广播

sendOrderedBroadcast(new Intent("com.example.action"), null)
Run Code Online (Sandbox Code Playgroud)

或者

adb shell am broadcast -a com.example.action
Run Code Online (Sandbox Code Playgroud)

这两种方法都适用于Android 7,但不适用于Android 8。但是,如果BroadcastReceiver通过 声明registerReceiver,则仍然可以接收广播。

另一方面,android.hardware.usb.action.USB_DEVICE_ATTACHED在 Android 7 和 8 上运行良好。

我想问为什么会出现这种情况?我已经在模拟器和物理设备中对其进行了测试。他们有相同的行为。

AndroidManifest.xml

...
<receiver
    android:name=".device.UsbBroadcastReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
        <action android:name="com.example.action" />
    </intent-filter>
    <meta-data
        android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
        android:resource="@xml/device_filter" />
</receiver>
...
Run Code Online (Sandbox Code Playgroud)

isl*_*rmd 5

作为 Android 8.0(API 级别 26)后台执行限制的一部分,面向 API 级别 26 或更高级别的应用程序无法再在其清单中注册隐式广播的广播接收器。

读这个