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

二、广播接收器的注册

    public class XxxBroadcastReceiver extends BroadcastReceiver {
       
            @Override
            public void onReceive(Context context, Intent intent) {
                
            }
        }
    

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

示例

    
        
            
        
    
    

特点:生命周期跟随系统,可以唤醒未启动的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、上下文注册(动态广播)

动态注册

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 以后静态的广播 限制性接收隐式广播(就是系统发送的广播,通过静态注册是可以接收的,例如电池状况,网络状态等等,但是不接收个人发送的隐式广播),但是可以发送显示广播

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

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

你可能感兴趣的:(Android,开发,android,android,studio,移动开发)