Android面试——BroadcastReceiver
来源:互联网 发布:日本美瞳 知乎 编辑:程序博客网 时间:2024/06/05 21:04
一、BroadcastReceiver是什么?
1.Broadcast是一种广泛运用的在应用程序之间传输信息的机制,可以跨进程通信,Android中我们要发送的广播内容是一个Intent,这个Intent可以携带我们要传送的数据。是android四大组件之一、是app内的全局监听器,运行于主线程中;
2.它实现了不同程序之间的数据共享:一条广播可以被多个广播接受者接受。Service的信息可以通过广播传送给Activity
3.作用域是全局,生命周期就是一个函数的生命周期
主要使用场景:
1.同一app具有多个进程的不同组件之间的消息通信
不同app之间的组件之间消息通信
主要分为3类:
1.无序广播 Normal Broadcast :任何接收者都能收到广播,效率高,但是接收者无法传递广播,也不能截断广播;
2.有序广播 System Broadcast :接收者按照优先级的高低来接收广播,每一个接收者都有权修改广播,并将修改后的广播内容传递给下一个接受者,每一个接收者也可以拦截广播。
本地广播 Local Broadcast :只在自身App内传播,高效的原因是内部通过handler实现。所以别的应用无法向我们的应用发送该广播。
二、BroadcastReceiver的实现原理是什么?
Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。
模型中主要有3个角色:消息订阅者(广播接收者);消息发布者(广播发布者);消息中心(AMS,即Activity Manager Service)
原理:
广播接收者通过Binder机制在 AMS(Activity Manager Service) 注册;
广播发送者通过Binder机制向 AMS 发送广播;
AMS根据广播发送者要求,在已注册列表中,寻找合适的BroadcastReceiver (寻找依据:IntentFilter / Permission);
AMS将广播发送到BroadcastReceiver相应的消息循环队列中;
广播接收者通过消息循环拿到此广播,并回调 onReceive()方法。
需要注意的是:广播的发送和接受是异步的,发送者不会关心有无接收者或者何时收到。
三、如何定义广播接收者
1.继承BroadcastReceivre基类;
2.必须复写抽象方法onReceive()方法,此方法里不能执行耗时操作。
public class MyBroadcastReceiver extends BroadcastReceiver { //接收到广播后自动调用该方法 @Override public void onReceive(Context context, Intent intent) { //写入接收广播后的操作 } }
四、如何注册广播接收器?
1.静态注册:
在AndroidManifest.xml里通过标签声明,缺点是注册完成就一直运行,就算进程被杀死,仍能接受到广播,不够灵活;
<receiver //此广播接收者类是MyBroadcastReceiver android:name=".MyBroadcastReceiver" > //用于接收网络状态改变时发出的广播 <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter></receiver>
2.动态注册:
在代码中通过调用Context的registerReceiver()方法进行动态注册,生命周期跟随Activity的生命周期。
@Override protected void onResume() { super.onResume(); //实例化BroadcastReceiver子类 & IntentFilter MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); //设置接收广播的类型 intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE); //调用Context的registerReceiver()方法进行动态注册 registerReceiver(mBroadcastReceiver, intentFilter); } //注册广播后,要在相应位置记得销毁广播 @Override protected void onPause() { super.onPause(); //销毁在onResume()方法中的广播 unregisterReceiver(mBroadcastReceiver); }}
之所以在onPause()注销是因为onPause()在Activity死亡前一定会被执行,从而保证广播在Activity死亡前一定会被注销,从而防止内存泄露。
动静态注册的优缺点和应用场景:
- Android面试——BroadcastReceiver
- android组件——BroadCastReceiver
- Android学习——BroadcastReceiver
- 初遇Android——BroadcastReceiver
- Android——BroadcastReceiver总结
- Android——BroadcastReceiver NullPointerException
- Android四大组件—BroadcastReceiver
- Android面试(三)BroadCastReceiver和Service
- Android面试常客--四大组件之BroadcastReceiver
- Android学习笔记21——BroadcastReceiver
- android学习——BroadCastReceiver 简介
- Android Service 服务—— BroadcastReceiver
- android组件——BroadCastReceiver(简例)
- Android Service 服务—— BroadcastReceiver
- Android——BroadcastReceiver 广播 短信拦截
- Android——组件值BroadcastReceiver
- Android四大组件——BroadcastReceiver
- Android基础——广播接收者BroadcastReceiver
- .net分布式压力测试工具(Beetle.DT)
- SpringMvc报错解决:Failed to instantiate [java.util.List]: Specified class is an interface
- HDU1019 水题+精度
- 软件磁盘阵列(Software RAID)介绍
- 总结过去,展望未来
- Android面试——BroadcastReceiver
- 笔试笔记(12)
- 思路分享 | 无弹窗APT渗透实验
- 51Nod-1254-最大子段和 V2
- JS笔记 —— 20个通用正则表达式
- 关于自己的一丢丢总结
- 求方差的公式是什么?
- Mysql让主键归0,重新从1开始
- 前端初学学习进程IX