Android基础-Broadcast Receiver

Broadcast Receiver面试详解

一、广播

1.定义:

Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。

 

2.广播的使用场景

A.同一app具有多个进程的不同组件之间的消息通信

B.不同app之间的组件之间消息通信

 

3.广播种类

1)Normal Broadcast: Context.sendBroadcast

2)System Broadcast:Context.sendOrderedBroadcast

3)Local Broadcast:只在自身App内传播

 

二、实现广播-receiver

1.静态注册:注册完成就一直运行(Manifest.xml中写)

 

2.动态注册:跟随activity的生命周期(一定要在onDestroy()unregister掉,否则会造成内存泄漏)

 

三、广播内部实现机制(涉及观察者模式)

1.自定义广播接收者BroadcastReceiver,并复写onRecvice()方法

2.通过Binder机制向AMS(Activity Manager Service)进行注册

3.广播发送者通过Binder机制向AMS发送广播

4.AMS查找符合相应条件(IntentFilter/Permission)BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中

5.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法

 

四、LocalBroadcastManager详解

1.使用它发送的广播将只在自身App内传播,因此你不必担心泄漏隐私数据

2.其他App无法对你的App发送广播,因为你的App根本就不可能接受到非自身应用发送的该广播,因此你不必担心有安全漏洞可以利用

3.比系统的全局广播更加高效

 

源码解析:

构造方法(private代表是单例、mHandle

 

 

**三个集合类

 

 

注册registerReceiver方法(注意mReceivers.put(receiver,filters)先为广播接收器添加过滤规则再最后entries.add(entry)分别对action分别建立映射)

 

 

反注册unregisterReceier方法(mRceivers中广播接收器删除,把mAction中的广播接收器移除)

 

 

sendBroadcast方法(把过滤后的添加到mPendingBroadcasts里,判断是否有消息,并通过前面提的构造函数里的handle进行处理)

 

 

源码总结:

1.LocalBroadcastManager高效的原因主义是因为它内部是通过Handle实现的,它的sendBroadcast()方法含义并非和我们平时所用的一样,它的sendBroadcast()方法其实是通过handler发送一个Message实现的

2.既然是它内部通过Handler来实现广播的发送的,那么相比系统广播通过Binder实现那肯定是更高效了,同时使用Handle来实现,别的应用无法向我们的应用发送该广播,而我们应用内发送的广播也不会离开我们的应用

3.LocalBroadcastManager内部协作主要是靠这两个Map集合:mReceiversmActions,当然还有一个mPendingBroadcasts,这个主要是存储待接收的广播对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值