BroadcastReceiver是android四大组件之一。
-
概念
系统在产生某个事件时发送广播,应用程序使用广播接收器接收这个广播,就知道系统产生了什么事件。
-
1. 广播类型
- 有序广播: 所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序。优先级高的接收者有能力终止这个广播。
- 无序广播: 所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到)。对于这种广播,接收者无法终止广播
- 优先级的定义:-1000~1000
- 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
- abortBroadCast:截断广播,在某个接收器收到消息后,调用该方法阻止其他接收者接收这条广播。只有有序广播可以被拦截
-
2. 创建BroadcastReceiver
创建自定义的接收器继承BroadcastReceiver 即可。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 此处用于收到广播消息后进行逻辑处理
// 我们可以通过Intent来传递数据
}
}
-
3. 注册方式
-
静态注册:在AndroidManifest.xml文件中像声明Activity一样,对Receiver进行注册,此方式的注册类似Service是常驻型的,当应用关闭后,如果有广播消息传来,MyReceiver也会被系统调用而自动运行。
示例:
-
静态注册:在AndroidManifest.xml文件中像声明Activity一样,对Receiver进行注册,此方式的注册类似Service是常驻型的,当应用关闭后,如果有广播消息传来,MyReceiver也会被系统调用而自动运行。
// android:priority 属性可有可无,如果想声明有序广播,需要加上优先级,普通广播不需要加
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.TEST_BROADCAST"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Intent intent = new Intent("android.intent.action.TEST_BROADCAST");
this.getContext().sendBroadcast(intent);//sendBroadcast是android.content.ContextWrapper类中的方法
配置了以上信息之后,通过为Intent设置广播地址,发送广播后,对应的接收器就可以接收广播了。
- **动态注册**:动态注册是在代码中动态的声明广播地址并注册,通常我们是在Activity或Service注册一个广播,此时广播接收器的生命周期和Activity或者Service绑定。Activity和Service处于运行状态才可以接收广播消息,Activity被销毁或者Service停止,相应的接收器也被销毁,并且取消注册。
示例:
// 创建IntentFilter过滤器以及广播接收器
IntentFilter filter = new IntentFilter();
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
// 动态注册
this.filter.addAction("android.intent.action.MY_BROADCAST");
this.getContext().registerReceiver(receiver, filter);
// 切记:动态注册需要重写onDestory方法,用于取消接收器的注册
@Override
public void onDestroy() {
this.getContext().unregisterReceiver(receiver);
super.onDestroy();
}
// 发送广播代码,只要给Intent配置对应的ACTION即可
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
this.getContext().sendBroadcast(intent);
-
4. 有序广播发送(引用)
示例代码:
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver.");
sendOrderedBroadcast(intent, "scott.permission.MY_BROADCAST_PERMISSION");
使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。这样做是从安全角度考虑的,例如:系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限。
<!-- 声明权限 -->
<permission android:protectionLevel="normal" android:name="scott.permission.MY_BROADCAST_PERMISSION" />
<!-- 然后声明使用了此权限 -->
<uses-permission android:name="scott.permission.MY_BROADCAST_PERMISSION" />
如果想在有序广播中截断广播消息的话,只需要在接收器的onReceive方法中调用abortBroadcast()即可截断优先级小于自己的接收器接收广播。
网友评论