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

Manifest-declared broadcast receiver does not receive custom broadcast on Android 8

首先,我创建了一个空体的 BroadcastReceiver。然后,我将它添加到 AndroidManifest.xml。但是我发现清单中声明的​​ BroadcastReceiver 没有收到任何广播。我通过

发送了广播
sendOrderedBroadcast(new Intent("com.example.action"), null)

adb shell am broadcast -a com.example.action

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

另一方面,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>
...

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

Read this

基于清单的广播在 android 8

为我工作

android 的广播限制不适用于所有广播,有些仍然可以在清单中注册。但是一定要检查最新的文档,因为这些可能取决于 android 版本。

 <receiver
            android:name=".UsbReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            </intent-filter>
            <meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />