当前位置:   article > 正文

Android开发 Android四大组件之 BroadcastReceiver(广播)_安卓开发 广播处理器

安卓开发 广播处理器

一、BroadcastReceiver随Android系统版本的改变

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 广播。无法在清单中声明接收器。

二、广播接收器的注册

  1. public class XxxBroadcastReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. }
  5. }

1、清单声明(静态广播)

示例

  1. <receiver android:name=".XxxBroadcastReceiver" android:exported="true">
  2. <intent-filter>
  3. <action android:name="“xxx.xxxx.xxxx”"/>
  4. </intent-filter>
  5. </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。

2、上下文注册(动态广播)

动态注册

  1. BroadcastReceiver xxxbr = new XxxBroadcastReceiver();
  2. IntentFilter filter = new IntentFilter();
  3. filter.addAction(“xxx.xxxx.xxxx”);
  4. this.registerReceiver(xxxbr , filter);

动态注册本地广播

LocalBroadcastManager.getInstance(this).registerReceiver(xxxbr, IntentFilter)

注册后记得解除注册,用什么注册就用什么解除

特点:动态广播可以被自己和其他应用过滤拦截;动态本地广播只能在被自己过滤拦截。

三、发送广播之标准广播和有序广播

标准广播:sendOrderedBroadcast(Intent, String) 方法一次向一个接收器发送广播。当接收器逐个顺序执行时,接收器可以向下传递结果,也可以完全中止广播,使其不再传递给其他接收器。接收器的运行顺序可以通过匹配的 intent-filter 的 android:priority 属性来控制;具有相同优先级的接收器将按随机顺序运行。

总结:异步广播


有序广播:sendBroadcast(Intent) 方法会按随机的顺序向所有接收器发送广播。这称为常规广播。这种方法效率更高,但也意味着接收器无法从其他接收器读取结果,无法传递从广播中收到的数据,也无法中止广播。

总结:同步广播

隐式和显式发送广播:

显式发送广播

  1. Intent intent = new Intent()
  2. intent.setComponent(new ComponentName(this,xxxBroadCastreceiver::class.java))
  3. sendBroadcast(intent)

显式需要指明广播接收器(类路径+类名),例如还可以 intent.setClass() 来设置,底层源码依旧调用的是ComponentName的构造方法。

隐式发送广播

  1. Intent intent = new Intent()
  2. intent.setAction("com.xxx.xxxx.xxxx")
  3. sendBroadcast(intent)

隐式通过匹配注册的广播的action或者category+action是值来触发广播。

注意:在Android 8.0 以后静态的广播 限制性接收隐式广播(就是系统发送的广播,通过静态注册是可以接收的,例如电池状况,网络状态等等,但是不接收个人发送的隐式广播),但是可以发送显示广播

总结:为了兼容可以减少或者不使用隐式发送广播

如果对您有一些意义,希望您给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/472314
推荐阅读
相关标签
  

闽ICP备14008679号