关于#android#的问题:Android发送的广播接收不到

Android发送的广播接收不到
--两个型号不同的同一品牌同一安卓版本的设备,一个可以接收广播,但另一个不行

看看 log 日志,是不是系统广播注册达到了上限了。
华为手机就有这种问题

后来把静态广播改成了动态广播就可以了,但是还是不知道为什么一台设备上可以用静态广播但另一台不行,明明版本都一样

系统版本也相同吗?相同的话,可能是楼上说的原因,不同的话,可能是兼容性没做好,可以分开调试。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/207467
  • 你也可以参考下这篇文章:Android 解决静态广播收不到的问题
  • 除此之外, 这篇博客: Android基础知识(十五):发送广播、本地广播的使用与Android O对广播的限制中的 Android基础知识(十五):发送广播、本地广播的使用与Android O对广播的限制 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    一、发送标准广播
    在笔记

    Android基础知识(十四):Broadcast Receiver简介与基本用法中可得知,标准广播是一种完全异步执行的广播,在广播发出后,所有广播接收器几乎都会在同一时刻接收到这条广播消息。
    通过静态注册一个广播接收器如下所示,其中action表示接受一条值为“android.inten……”的广播,即表明了该广播接收器可接受的广播
    在这里插入图片描述
    通过Intent发送一条标准广播的方式如下所示。使用Intent将发送的广播的值(action)传入,调用sendBroadcast()方法进行发送,这样所有监听该值的广播接收器都会接收到该广播消息。(关于setPackage()方法的用处在后面将会解释)。
    在这里插入图片描述
    在这里插入图片描述
    以上就实现了发送标准广播的功能。此外,由于广播是使用Intent进行传递的,因此可以在Intent中携带一些数据传递给广播接收器

    二、发送有序广播
    前面提到了,有序广播是一种同步执行的广播优先级高的广播接收器会先接收到广播,因此这里涉及到了设置广播接收器的优先级设置。如下所示,这里将该广播接收器的优先级设置为100,即最高优先级。
    在这里插入图片描述
    至于有序广播的发送方法,如下所示,与发送标准广播的方式几乎一致,不同在于有序广播使用的是sendOrderedBroadcast()方法进行广播的发送,其中第一个参数为intent,第二个参数是与权限有关的字符串。
    在这里插入图片描述
    有序广播的传递是可截断的,在广播接收器中使用方法abortBroadcast()当该广播接收到广播时,将会截断该广播使得比其优先级低的广播接收器无法接收到该广播。
    在这里插入图片描述

    三、本地广播的使用
    上述发送和接收的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到。而正是由于这个特性,使得容易引起安全性的问题,比如发送的广播里面携带了关键性数据可能被其他应用程序截获,或者其他程序不断的向广播接收器发送垃圾广播。
    为了解决广播的安全性问题,Android提供了一套本地广播机制。使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收到来自本应用发出的广播
    本地广播主要使用一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法。如下所示为注册本地广播,注销本地广播以及定义广播接收器的简单例子。
    在这里插入图片描述
    发送本地广播如下所示,除了使用LocalBroadcastManager的sendBroadcast()方法进行本地广播的发送之外,实际上和发送广播没啥区别。
    在这里插入图片描述
    需要注意的是,本地广播是无法通过静态注册的方式来接收的
    本地广播的几点优势:
     可以明确的知道正在发送的广播不会离开程序,不必担心机密数据泄露。
     其他程序无法将广播发送到程序内部,因此不需要担心会有安全漏洞的隐患。
     发送本地广播比发送系统全局广播将会更加高效。

    四、Android8.0中对广播的更改
    Google为了降低功耗,改进Android系统的电池表现,为APP注册的静态广播导致耗电添加了限制
    在这里插入图片描述
    Google所加入的限制很重要的一部分就是后台执行限制,其中对广播的限制为许多隐式广播无法在manifest中静态注册的BroadcastReceiver收到(其实这一举措在Android7.0中已经初见端倪)。除了由系统发出的隐式广播之外,在应用中自定义的广播也无法被静态注册的BroadcastReceiver收到
    在这里插入图片描述
    那么问题来了,自定义的广播如何被静态注册的BroadcastReceiver接收到呢?
    解决方法有两种:
     使用动态注册广播接收器,而不使用静态注册的广播接收器(这tm不是解决方法吧)。
     官方推荐使用JobScheduler替代原来用隐式广播实现功能,但是没有广播那么灵活。
     发送广播之前,Intent调用setPackage()方法设置Package,使得发送的广播改为显示广播,如下所示。
    在这里插入图片描述
    在这里插入图片描述

    参考资料:《第一行代码 Android 第2版》
    Android O 对隐式广播的限制以及对策


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^