赞
踩
Android 9.0
从 Android 9(API 级别 28)开始,NETWORK_STATE_CHANGED_ACTION 广播不再接收有关用户位置或个人身份数据的信息。此外,如果您的应用安装在搭载 Android 9 或更高版本的设备上,则通过 WLAN 接收的系统广播不包含 SSID、BSSID、连接信息或扫描结果。要获取这些信息,可以调用 getConnectionInfo()获取。
Android 8.0
从 Android 8.0(API 级别 26)开始,系统对清单声明的接收器施加了额外的限制。如果您的应用以 Android 8.0 或更高版本为目标平台,那么对于大多数隐式广播,您不能使用清单来声明接收器。当用户正在活跃地使用您的应用时,仍可使用上下文注册的接收器。
Android 7.0
Android 7.0(API 级别 24)及更高版本不发送以下系统广播:
ACTION_NEW_PICTURE
ACTION_NEW_VIDEO
此外,以 Android 7.0 及更高版本为目标平台的应用必须使用 registerReceiver(BroadcastReceiver, IntentFilter) 注册 CONNECTIVITY_ACTION 广播。无法在清单中声明接收器。
- public class XxxBroadcastReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
-
- }
- }
示例
- <receiver android:name=".XxxBroadcastReceiver" android:exported="true">
- <intent-filter>
- <action android:name="“xxx.xxxx.xxxx”"/>
- </intent-filter>
- </receiver>
特点:生命周期跟随系统,可以唤醒未启动的APP。
说明:android:exported = true 是可以接收APP 外部广播,false 不接收APP 外部广播
补充匹配规则:
1.action的匹配规则
action是一个字符串,系统预定义了一些action,同时可以在应用中定义自己的action。匹配规则是Intent中的action有一个和过滤规则中的action完全匹配,就是action的字符串值完全一样,因为action区分大小写,或者说intent携带的action和过滤规则中的action有交集就行。2.category的匹配规则
category是一个字符串。category的匹配规则是:Intent中可以没有category,如果有category,不管有几个,每个都要能够和过滤规则中的category其中一个匹配,
就是包含intent中的category,或者intent中的category是过滤规则的category的子集。3.data的匹配规
data的匹配规则:Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。
动态注册
- BroadcastReceiver xxxbr = new XxxBroadcastReceiver();
-
-
- IntentFilter filter = new IntentFilter();
- filter.addAction(“xxx.xxxx.xxxx”);
- this.registerReceiver(xxxbr , filter);
动态注册本地广播
LocalBroadcastManager.getInstance(this).registerReceiver(xxxbr, IntentFilter)
注册后记得解除注册,用什么注册就用什么解除
特点:动态广播可以被自己和其他应用过滤拦截;动态本地广播只能在被自己过滤拦截。
标准广播:sendOrderedBroadcast(Intent, String) 方法一次向一个接收器发送广播。当接收器逐个顺序执行时,接收器可以向下传递结果,也可以完全中止广播,使其不再传递给其他接收器。接收器的运行顺序可以通过匹配的 intent-filter 的 android:priority 属性来控制;具有相同优先级的接收器将按随机顺序运行。
总结:异步广播
有序广播:sendBroadcast(Intent) 方法会按随机的顺序向所有接收器发送广播。这称为常规广播。这种方法效率更高,但也意味着接收器无法从其他接收器读取结果,无法传递从广播中收到的数据,也无法中止广播。
总结:同步广播
隐式和显式发送广播:
显式发送广播
- Intent intent = new Intent()
- intent.setComponent(new ComponentName(this,xxxBroadCastreceiver::class.java))
- sendBroadcast(intent)
显式需要指明广播接收器(类路径+类名),例如还可以 intent.setClass() 来设置,底层源码依旧调用的是ComponentName的构造方法。
隐式发送广播
- Intent intent = new Intent()
- intent.setAction("com.xxx.xxxx.xxxx")
- sendBroadcast(intent)
隐式通过匹配注册的广播的action或者category+action是值来触发广播。
注意:在Android 8.0 以后静态的广播 限制性接收隐式广播(就是系统发送的广播,通过静态注册是可以接收的,例如电池状况,网络状态等等,但是不接收个人发送的隐式广播),但是可以发送显示广播
总结:为了兼容可以减少或者不使用隐式发送广播
如果对您有一些意义,希望您给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。