Android发送的广播接收不到
--两个型号不同的同一品牌同一安卓版本的设备,一个可以接收广播,但另一个不行
看看 log 日志,是不是系统广播注册达到了上限了。
华为手机就有这种问题
后来把静态广播改成了动态广播就可以了,但是还是不知道为什么一台设备上可以用静态广播但另一台不行,明明版本都一样
系统版本也相同吗?相同的话,可能是楼上说的原因,不同的话,可能是兼容性没做好,可以分开调试。
不知道你这个问题是否已经解决, 如果还没有解决的话:一、发送标准广播
在笔记
二、发送有序广播
前面提到了,有序广播是一种同步执行的广播,优先级高的广播接收器会先接收到广播,因此这里涉及到了设置广播接收器的优先级设置。如下所示,这里将该广播接收器的优先级设置为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 对隐式广播的限制以及对策