广播是一种广泛运用的在应用程序之间传输信息的机制,Android 为了将系统运行时的各种“事件”通知给其他应用,因此内置了多种广播。广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。Android 中的每个应用程序都可以对自己感兴趣的广播进行 ...
广播是一种广泛运用的在应用程序之间传输信息的机制,Android 为了将系统运行时的各种“事件”通知给其他应用,因此内置了多种广播。广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的,前者是系统广播,后者是自定义广播。广播在具体的项目中应用场景并不多,但一旦使用会使得程序变得精简很多,因此本片文章就简单介绍一下安卓系统的广播机制。
首先,简单的介绍一下安卓的广播机制。BroadCastReceiver是对发送出来的Broadcast 进行过滤接受并响应的一类组件,是Android四大组件之一,主要用于接收系统或者app发送的广播事件。在我们的项目中经常使用广播接收者接收系统通知,比如开机启动、sd挂载、低电量、外播电话、锁屏等。 如果我们做的是播放器,那么监听到用户锁屏后我们应该将我们的播放之暂停等。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系, 有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。广播有利于程序间互通消息,例如在自己的应用程序内监听系统来电。
BroadCastReceiver的一般编写步骤:
1. 写一个类继承BroadCastReceiver;
2. 重写oncreat()方法;
3. 注册广播。动态注册和静态注册,前者在java代码中实现,后这在清单文件中编写。动态注册需要写BroadCastReceiver的实现类和过滤器,静态注册除了写过滤器外还要在receiver标签的name属性上添加包名和类名。
按照广播的属性来分,广播分两种:有序广播和无序广播。
无序广播:又叫普通广播,完全异步,不会被某个广播接收者终止,逻辑上可以被任何广播接收者接收到,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent的传播。Context.sendBroadcast() 发送的是普通广播,所有订阅者都有机会获得并进行处理。
有序广播:按照被接收者的优先级顺序,在被接收者中依次传播。比如有三个广播接收者A,B,C,优先级是A > B > C。那这个消息先传给A,再传给B,最后传给C。,因此通常需要在AndroidManifest.
对于有序广播有一个小细节,那就是优先级高的广播可以终结一个广播。终止一个有序广播:abortBroadcast()。终止有序广播只需要一句代码,该代码是BroadCastReceiver 类中的方法,因此这里可以直接使用。这里需要注意的是如果abortBroadCast 是在一个无序广播中执行的,那么就会报如下异常:
java.lang.RuntimeException:
BroadcastReceiver trying to return result during a non-ordered broadcast
在低版本的手机上比如Android2.3 上是不会报这样的异常的,安卓工程师认为终止无序广播是不合法的操作,因此在Android2.3之后的版本,终止无序广播都是非法操作。为了防止我们终止一个无序广播导致报异常,我们可以先判断接收到的广播类型。优化后的代码如下:
if (isOrderedBroadcast()) {
abortBroadcast();
}
isOrderedBroadcast 方法是BroadCastReceiver 类提供的,用于判断当前的广播类型。返回true 为有序广播,返回false 为无序广播。
之后,再来讲一下广播的注册机制。广播注册方式有两种,动态注册和静态注册。在清单文件中注册广播接收者称为静态注册,在代码中注册称为动态注册。静态注册的广播接收者只要app在系统中运行则一直可以接收到广播消息,动态注册的广播接收者当注册的Activity或者Service销毁了那么就接收不到广播了。
静态注册:在清单文件中进行如下配置
<receiver android:name="包名+类名" > <intent-filter> <action android:name="android.intent.action.CALL" > </action> </intent-filter> </receiver>
原标题:安卓四大组件之广播
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。