关于Broadcast Receiver的知识点
一,广播
二,实现广播
三,广播实现机制
四,LoacalBroadcastManager详解
一,广播
1,广播定义:类似观察者模式
2,广播场景
3,广播种类
1,定义:
在Android中,Broadcast时一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据
可以让Service发广播到接收者。
2,使用场景:
A: 同个App具有多个进程的不同组件之间的消息通信
B:不同App之间的组件之间的消息通信
3,种类
1)Normal Broadcast:Context.sendBroadcast(),该广播是未定义顺序的,异步的
2)System Broadcast:Context:sendOrdered Broadcast:有序的
3)Local Broadcast:只在app内传播
二,实现广播receiver
1,静态注册:注册完成就一直运行(写在mainfest中,activity被销毁或者app被杀死的时候,还能收到广播)
2,动态注册:跟随activity的生命周期(代码中进行注册和解绑)
三,内部实现机制
1,自定义广播接收者BroadcastReceiver,并复写onRecvice();
2,通过Binder机制向AMS(Activity Manager Service)进行注册;
3,广播发送者通过Binder机制向AMS发送广播;
4,AMS查找符合条件(IntentFilter / Permission等)的BroadcastReceiver,将广播发送到Broadcast Receiver(一般情况下是activity)相应的消息循环队列中;
5,消息循环执行到此广播,回调BroadcastReceiver中的onReceiver()方法
四,localBroadcastManager详解
1,使用它发送的广播将只在app内部传输,因此不必担心泄露隐私数据
2,其他app无法对你的app发送该挂广播,因此你的app根本不可能接收到非自身应用发送的该广播,因此你不必担心有它会泄露可以利用
3,比系统的全局广播更加高效
从源码的角度看,广播用的是单例管理
1,LocalBroadcastManager高效的原因主要是因为它内部通过Handler实现,它的sendBroadcast()方法含义并非我们平时所用的一样,它的sendBoradcast()方法其实是通过Handler,发送一个message实现的。
2,既然是它内部通过Handler来实现广播的发送的,那么相比与系统广播通过Binder实现,那肯定是更加高效的。
同时使用Handler实现,别的应用无法向我们的应用发送该广播,而我们应用内发送的广播也不会离开我们的应用。
3,LocalBroadcastManager内部协作主要是靠这两个Map集合,mReceiver和mActions,当然还有一个list集合mPendingBroadcasts,这个主要就是在存储待接收的广播对象。