android 8.0静态注册的隐式广播接收不到

先说解决方法吧:

(1)使用动态广播代替静态广播。

(2)保留原来的静态广播,但是加入组件参数。

(3)发送广播的时候携带intent.addFlags(0x01000000); 即能让广播突破隐式广播限制。

      在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的。比如,经过楼主测试,对接收的安卓开机的广播通过静态注册还是能够正常接收的。哪些静态注册的广播还可以接受的到?

       Android 8.0行为变更的介绍链接:https://developer.android.com/about/versions/oreo/android-8.0-changes.html? HL = ZH-CN,前面那个链接必须通过FQ,当然我们提倡科学上网。

广播限制

如果应用程序注册接收广播,则应用程序的接收器会在每次发送广播时消耗资源如果有太多应用程序注册接收基于系统事件的广播,则会导致问题。触发广播的系统事件可能导致所有这些应用快速连续消耗资源,从而影响用户体验。为了缓解此问题,Android 7.0(API级别24)对广播施加了限制,如  背景优化中所述 .Android 8.0(API级别26)使这些限制更加严格。

  • 针对Android 8.0或更高版本的应用无法再在其清单中为隐式广播注册广播接收器。一个隐含的广播是没有指定一个专门的应用程序的广播。例如,ACTION_PACKAGE_REPLACED是一个隐式广播,因为它被发送到所有已注册的侦听器,让他们知道设备上的某些包被替换。但是,ACTION_MY_PACKAGE_REPLACED它不是隐式广播,因为它只发送到其软件包被替换的应用程序,无论有多少其他应用程序注册了该广播的监听器。
  • 应用可以继续在其清单中注册明确的广播。
  • 程序应用可以Context.registerReceiver()在运行时使用为任何广播注册接收器,无论是隐式还是显式。
  • 需要签名许可的广播免除此限制,因为这些广播仅发送到使用相同证书签名的应用程序,而不是发送到设备上的所有应用程序。

在许多情况下,为先前隐式广播注册的应用程序可以通过使用JobScheduler作业获得类似的功能。例如,社交照片应用可能需要不时对其数据进行清理,并且在设备连接到充电器时更喜欢这样做。以前,应用该程序ACTION_POWER_CONNECTED在其清单中注册了一个接收器; 当应用程序收到该广播时,它将检查是否有必要进行清理。要迁移到Android 8.0或更高版本,应用程序会从其清单中删除该接收器。相反,应用程序会安排在设备空闲和充电时运行的清理作业。

注意:目前许多隐式广播都免于此限制无论应用针对哪种API级别,应用都可以在其清单中继续为这些广播注册接收器有关豁免广播的列表,请参阅。隐式广播例外。

https://blog.csdn.net/sunqiujing/article/details/77212804


 

 

你可能感兴趣的:(Android)