Broadcast相关问题总结
广播
定义
在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据;
1.广播可以在不同应用程序之间传递信息,即应用定义了相应的action,就可以接收到数据;(这个也不一定)
2.可以通过广播来实现service与Activity的数据交互,比如通知Activity更新UI;(这个一般不这么做)
场景
-
同一个app内,多个进程的不同组件之间的消息通信;
比如app内有一个主进程,一个定位地图的进程,可以通过广播来进行两个进程之间的通信(我的观点是不如老老实实用binder) -
不同app之间的组件之间消息通信;
两个app之间通过发送广播来传递消息
种类
-
Normal Broadcast: Context.sendBroadcast (无序广播)
-
System Broadcast: Context.sendOrderedBroadcast (有序广播)
-
local Broadcast: 只在自身app内部传播 (本地广播)
实现广播
1. 静态广播
注册完成就一直运行
将广播接收者写在Manifest.xml文件中;
静态广播的特点是:
所依赖的Activity被销毁后,依然能接收到广播,甚至app进程被杀掉后也能接收到广播
2. 动态广播
跟随Activity的生命周期
在代码中调用registerReceiver方法来注册广播;
动态注册广播一定要注意:
在onDestroy方法中执行unRegisterReceiver方法解除注册,否则会引起内存泄漏;
同时动态注册的广播生命周期是跟随Activity生命周期的,所以当Activity被销毁了,动态注册的广播也就失效了;
3. 动态广播和静态广播的区别
-
动态广播是在代码中注册,静态广播是在manifest.xml文件中写死的
-
动态广播受Activity生命周期的影响,Activity销毁了,广播也就失效了;静态注册广播即使Activity被销毁了,甚至进程被杀掉,也能收到广播;
广播实现机制
- 自定义广播接收者BroadcastReceiver,并复写onReceive方法;
- 通过Binder机制向ams进行注册;
- 广播发送者通过Binder机制向ams发送广播;
- ams查找符合响应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
- 消息循环执行拿到此广播,回调BroadcastReceiver中的onReceiver方法;
LocalBroadcastManager 详解
本地广播有如下几个特点:
- 使用它发送的广播将只在自身app内传播,不必担心泄漏隐私数据;
- 其他的app无法对你的app发送该广播,因为你的app根本就不可能接收到非自身应用发送的该广播,因此不必担心安全漏洞
- 比系统的全局广播更加高效
分析:
-
LocalBroadcastManager高效的原因主要是因为它内部是通过Handler实现,它的sendBroadcast方法含义并非我们平时所用到的那样,它的sendBroadcast方法实际上是通过handler发送一个Message实现的
-
既然它内部是通过Handler来实现广播的发送,那么相比系统广播通过binder来实现肯定更加高效了,同时使用Handler来实现,别的应用也无法像我们的应用发送广播,而我们的应用广播也不会离开我们的应用。
-
LocalBroadcastManager内部协作主要是靠两个map集合:MReceivers和mActions,当然还有一个list集合mPendingBroadcasts,这个主要存储待接收的广播对象