Android开发 Android四大组件之 BroadcastReceiver(广播)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 Android开发 Android四大组件之 BroadcastReceiver(广播),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、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、清单声明(静态广播)

示例

    <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。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128346.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!