BroadcastReceiver

一、什么是BroadcastReceiver?

  • 是android四大组件之一、是app内的全局监听器,运行于主线程中;
  • 可以用于进程内通信,也可以用于进程间通信(跨进程通信);
  • 主要分为两种:无序广播、有序广播
    • 无序广播:任何接收者都能收到广播,效率高,但是接收者无法传递广播,也不能截断广播
    • 有序广播:接收者按照优先级的高低来接收广播,每一个接收者都有权修改广播,并将修改后的广播内容传递给下一个接受者,每一个接收者也可以拦截广播。

二、BroadcastReceiver的实现原理是什么?

  • 设计模式:观察者模式
  • 3个重要概念:广播接收者、广播的发送者、消息中心(AMS)
    广播实现原理图

原理描述

  • 广播接收者 通过 Binder机制在 AMS 注册
  • 广播发送者 通过 Binder 机制向 AMS 发送广播
  • AMS 根据 广播发送者 要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission)
  • AMS将广播发送到合适的广播接收者相应的消息循环队列中;
  • 广播接收者通过 消息循环 拿到此广播,并回调 onReceive()

注意:广播的发送和接受是异步的,发送者不会关心有无接收者或者何时收到。

三、如何定义广播接收者?

  • 继承自BroadcastReceivre基类
  • 必须复写抽象方法onReceive()方法
public class mBroadcastReceiver extends BroadcastReceiver {

 //接收到广播后自动调用该方法 
 @Override
 public void onReceive(Context context, Intent intent) {
     //写入接收广播后的操作
     } 
}

四、如何注册广播接收器?

静态注册 动态注册

  • 静态注册
    • 在AndroidManifest.xml里通过标签声明
<receiver
    //此广播接收者类是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
  • 动态注册
    • 在代码中通过调用Context的registerReceiver()方法进行动态注册BroadcastReceiver
@Override
    protected void onResume() {
        super.onResume();
        //实例化BroadcastReceiver子类 & IntentFilter
        mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        //设置接收广播的类型
        intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
        //调用Context的registerReceiver()方法进行动态注册
        registerReceiver(mBroadcastReceiver, intentFilter);
    }
    //注册广播后,要在相应位置记得销毁广播
    // 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
    // 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
    // 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
    @Override
    protected void onPause() {
        super.onPause();
        //销毁在onResume()方法中的广播
        unregisterReceiver(mBroadcastReceiver);
    }
}

注意:在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。

静态注册和动态注册广播的区别

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值