美文网首页
BroadcastReceiver

BroadcastReceiver

作者: ChongmingLiu | 来源:发表于2017-03-16 18:08 被阅读51次

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也会被系统调用而自动运行。
      示例:
// 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()即可截断优先级小于自己的接收器接收广播。

相关文章

网友评论

      本文标题:BroadcastReceiver

      本文链接:https://www.haomeiwen.com/subject/wbyjnttx.html