广播作为Android四大组件之一,是一种很好的解耦方案,常见的广播有这两种类型:
Normal broadcasts无序广播,会异步的发送给所有的Receiver,接收到广播的顺序是不确定的,有可能是同时。 Ordered broadcasts有序广播,广播会先发送给优先级高(android:priority)的Receiver,而且这个Receiver有权决定是继续发送到下一个Receiver或者是直接终止广播。
广播的注册有两种:动态和静态
如果不是频繁刷新界面,使用广播也是可以的,广播的发送和接收有一定的代价,它的传输是通过Binder进程通信机制来实现,同时广播的发送和接收不一定准时。AMS有个消息队列专门接收发送的广播,sendBroadcast执行后就被添加到消息队列,直接返回了不会等待处理结果,而消息队列不一定会被马上执行,当处理当前广播时,会把它分发给注册好的广播接收器ReceiverDispatcher,最后还是将广播交给给reciver所在的线程的消息队列去处理,如果中间有一个消息的处理阻塞了,那么onReceiver的执行也会延迟,所以尽量少使用广播更新界面。
基于安全考虑,如何让发送的广播只有本进程能接收到?
1、发送广播时设置权限,只有拥有这个权限的接收者才能收到。但是如果APK被反编译,该权限只是一个字符串,这样也是不安全的。 2、使用Handler(往主线程的MessageQueue发送消息,只有主线程的Handler可以分发处理)广播发送的内容是一个Intent对象,所以可以直接用Message封装一下,留一个和sendBroadcast一样的接口,然后在handleMessage时把Intent对象传递给已经注册的receiver,例如LocalBroadcastManager类