Android学习笔记--四大组件之BroadcastReceiver

BroadcastReceiver是什么?


BroadcastReceiver字面翻译是“广播接收者”。

他会接受来自系统和程序所发出的广播。这是android系统非常有用的一项功能。曾经看过一篇文章,说没有BroadcastReceiver的塞班系统,要做个短信拦截功能,还得从开机就加载一个服务,一直在后台运行,等待这接收短信这短短的几秒,忍辱负重干了这么多,还背负了一个“流氓软件”的骂名。当我们的系统有了Broadcast,这个功能就会很容易实现,我们不用再管什么后台服务了,只要知道这个广播的名字就OK了。然后一切就交给系统,等有了你需要的广播的时候,比如说开机,收到短信,网络环境发生变化,或者我们自定义的广播发送,这些都会激发你的Receiver工作。从而完成一系列你想要实现的功能。这就是android的广播和广播接收者机制。


BroadcastReceiver的注册


静态注册


静态注册就是在我们工程的AndroidManifest.xml中配置的。

<receiver android:name=".MyReceiver">
        	<intent-filter>
        		<action android:name="xxxxxxx"/>
        	</intent-filter>
        </receiver>

action android:name="xxxxxxxxxxx"这个就是我们的广播地址了。如果是系统的广播,那要去查api,每个事件会对应不同的广播地址。写对了地址我们才能正确的接收到广播。

如果是自定义的广播,那么也要跟我们app中Intent发送的广播地址一致,相当于广播的认证码。静态注册是常驻的,不会因为我们没有打开app而收不到广播。


动态注册
动态注册就是在我们的Activity或者Service中通过代码进行注册。动态注册是只有当我们程序运行时才会接收到广播,而且,动态注册要注意在用完后解除注册,负责系统会抛出异常,下面我们用代码来展示动态注册与解除注册。

MyReceiver receiver = new MyReceiver();
        
IntentFilter filter = new IntentFilter();
filter.addAction("xxxxxxxxxxxxxxxx");
        
registerReceiver(receiver, filter);
同样的 xxxxxxxxx就是我们的广播地址。
@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}


BroadcastReceiver的工作机制

我们画张图来说明,比如说来了一条短信。


上图就是BroadCastReceiver的执行机制。就是系统发送一条特定的广播,然后找到注册了该广播地址的广播接收者,广播接收者启动,出发他的onReceive方法,我们重写这个方法,通过使用Intent使他能够按照我们的需求来执行一些代码,比如说起个activity、service等等。

当然这只是最普通的BroadCastReceiver的执行机制,如果有两个或多个接收者注册了同一个广播地址,广播该怎么发送?下面我们来介绍广播的种类。


BroadcastReceiver的种类


普通广播 Normal broadcasts

只要订阅了某个广播的所有的接受者,当广播发送的时候都会收到,没有优先级,系统会无序的将广播发送到每一个订阅了该广播的接收者,接收者之间互不干涉。


顺序广播 Ordered broadcasts

所谓有序广播,当一个广播地址有多个接收者注册的时候,系统会按照优先级进行发送,优先级高的接收者接到广播,会将他传给比他优先级低的广播,并且,优先级高的接收者有权利终止广播的传送(在onReceive里面调用abortBroadcast()方法)。

那么优先级怎么设置呢?

<receiver android:name=".MyReceiver">
        	<intent-filter android:priority="1000">
        		<action android:name="xxxxxxxxxxxxxxxxxxxxxxx"/>
        		<category android:name="android.intent.category.DEFAULT" />
        	</intent-filter>
        </receiver>

<intent-filter android:priority="1000">

这段语句就是来描述优先级的了,他的值从-1000到1000不等,数值越大,优先级越高。

如果几个接收者的优先级相同,那么就会像普通广播一样,无序发送。

但是网上有一种说法,通过动态注册有序广播,会获得更高的优先级。例如360,他总是能比你先揽到短信,就算你也注册了优先级为1000的接收者,这是为什么呢。网络上查了很多资料,有一种解释就是动态注册。未经过考证,希望有用的同学拿去考证。

下面附上链接比360短信拦截拥有更高优先级

好了,目前还没用到过广播,所以没法写例子,以后工作中用到了,会第一时间发上来解析,与大家分享。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值