1、广播
1、广播的定义
广播是一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent可以携带我们要传输的数据。广播的实现机制是比较类似于Java设计模式中的观察者模式。2、广播的场景
3、广播的种类
1、Normal Broadcast :Context.sendBroadcast
2、system Boradcast: Context.sendOrderedBroadcast
3、Local Broadcast:只有自身APP广播
2、实现广播-receiver
1、静态注册:注册完成后就一直运行,静态注册也就是把广播接收者写在Manifest中。静态注册还有个特点是即使receiver所依附的Activity被销毁了,receiver仍然可以接收广播甚至,把App进程杀死,receiver仍然可以接收广播。但是相比于动态注册,静态注册的灵活性还是比较低的。
2、动态注册:跟随Activity的生命周期。动态注册就是在代码中使用registerReceicer()动态注册广播接收器,同时在Activity的onDestory方法中一定要unregisterReceicer()注销广播,否则会引起内存泄漏。动态注册的Receiver的生命周期是跟随Activity的生命周期的,也就是说当Activity生命结束的时候,Receiver的也随之失效。
3、静态注册和动态注册的区别:动态注册是在代码中使用registerReceicer()动态注册广播接收器,而静态注册是在项目配置文件Manifest中写的。动态注册会受到Activity的生命周期影响,Activity一旦被销毁,广播接收者也随之失效。而静态注册的广播接收者,即使Activity被销毁了,广播接收器仍然能接收到广播,甚至APP进程别销毁额时候,广播接收器仍然能接收到广播。
3、广播的内部实现机制
1、自定义广播接收者BroadcastReceiver, 并复写onReceive()方法;
2、通过Bind机制向AMS(Activity Manager Service)进行注册;
3、广播发送者通过Binder机制向AMS发送广播;
4、AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的循环队列中。
5、消息循环拿到次广播,回调BroadcastReceiver的onReceiver()方法。
4、LocalBroadcastManager详解
1、使用它发送的广播只在自身app内传播, 因此你不必担心泄露隐私数据。
2、其他app无法对你的app发送该广播,因为你的app根本就不可能接收到非自身应用发送的该广播,因此不必担心有安全漏洞可以利用
3、比系统的全局广播更加高效
LocalBroadcastManager高效的原因主要是因为它内部是通过Handler实现的,他的SendBroadcast方法含义并非和我们平时所使用的的一样,他的sendBroadcast其实是通过关联组线程的Handler发送message来实现的。
既然他的内部是通过实现Handler来发送广播的,那么相比系统广播通过Bind机制来实现肯定高效,同时使用Handler来实现,别的应用无法向我们的应用发送广播,而我们应用内发送的广播也离不开我们的应用。
LocalBroadcastManager内部内部协作主要是靠两个Map集合:mRecever和mActions,还有一个List集合mPending Broadcast,这个就是储存待接收的广播对象。