BroadcastReceiver
来源:互联网 发布:知乎电子指纹锁品牌 编辑:程序博客网 时间:2024/06/06 18:49
一、什么是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 0
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadCastReceiver
- BroadcastReceiver
- broadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- BroadcastReceiver
- TF-IDF教程
- 更换mysql-connector-java-6.0.5jar包后程序出现的两个异常及解决方法
- linux系统最最最最常用的操作指令
- 记录PHP中常用函数
- nyoj-2359 巴什博弈?(模板)
- BroadcastReceiver
- PyCharm中Python的“ ModuleNotFoundError ”
- 【BZOJ1334】【Baltic2008】Elect
- HDU 3746 Cyclic Nacklace——kmp
- MySQL AB复制
- bzoj4991: [Usaco2017 Feb]Why Did the Cow Cross the Road III
- 扩展欧几里得算法详解
- bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
- 接口、继承与多态