Android四大组件之BroadcastReceiver简介

一、什么是BroadcastReceiver

BroadcastReceiver就是广播接收器,是一种对广播消息进行过滤并相应的控件。它和事件处理机制类似,只不过事件处理机制是程序组件级别的,例如,某个按钮的单击事件。而广播事件处理机制是系统级别的,例如,系统时区的改变、系统时间改变、电池电量低等。
注意,在程序中实现自定义的BroadcastReceiver必须要注册。

二、BroadcastReceiver的运行机制

BroadcastReceiver的运行机制比较简单,首先是构建Intent对象,然后调用sendBroadcast()方法发送广播。当应用程序注册了BroadcastReceiver之后,当系统或其它应用程序发出广播时,所有注册的BroadcastReceiver就会检查注册时的IntentFilter是否与发送的Intent想匹配,若是匹配则调用onReceiver()方法,在该方法中响应事件。

1、发送广播的方法

BroadcastReceiver发送广播有三种方式,各种发送方式的不同之处如下:
(1)使用sendBroadcast()或者sendStickyBroadcast()方法
使用sendBroadcast()方法发送的广播,所有满足条件的都会执行onReceive()方法来响应事件,但如果有多个满足条件的BroadcastReceiver时,onReceive()方法执行顺序是不确定的。
(2)使用sendOrderedBroadcast()
使用sendOrderedBroadcast()方法发送的广播,会根据BroadcastReceiver的注册时IntentFilter中设置的优先级顺序执行onReceive()方法,而相同优先级的BroadcastReceiver,执行onReceive()方法顺序是不确定的。
(3)使用sendStickyBroadcast()
使用sendStickyBroadcast()方法与前两种方法的主要不同是,Intent在发送后会一直存在,并且在以后调用registerReceiver注册相匹配的Receive时会把这个Intent直接返回给新注册的Receive。

2、接收广播的过程

BroadcastReceiver的接收程序开发过程:编写BroadcastReceiver类的子类,重写onReceive()方法对事件进行响应处理,并对BroadcastReceiver类的子类进行静态注册或者动态注册。
BroadcastReceiver的最长执行时间则是10秒,因此在onReceive()方法里面最好不要有超过10秒的代码,否则就会导致ANR(ANR:Application Not Responding),即应用程序不响应。建议把比较耗时的代码写在线程当中,单独进行处理。

三、BroadcastReceiver的注册方式及其生命周期

1、静态注册

静态注册方式是在配置文件中的application标签里面添加<receiver>标签,并且设置要接收的action。这种方式比较常用。
Android系统提供了很多标准广播Action。这些广播是系统自动发出的,可以在<intent-filter>的<action>中直接使用系统提供的标准广播常量。

2、静态注册的BroadcastReceiver生命周期

静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。

3、动态注册

动态注册方式是在Activity里面通过调用registerReceiver()方法来注册。例如下图
 
registerReceiver()方法有两个参数,第一个参数是指定接收器对象,第二个参数是IntentFilter对象,其内是要接收的action属性。

4、动态注册的BroadcastReceiver生命周期

动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了,即广播接收器的生命周期结束。

5、两种注册方式的比较

静态注册方式的特点:在应用程序安装完成之后,无论该应用程序是否处于活动状态,BroadcastReceiver始终处于被监听状态。 这种注册方式通常用于监听系统状态的改变,如手机的电量,日期的改变,时区的改变,WIFI网卡的注册状态等。
动态注册方式的特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。 这样注册的BroadcastReceiver通常用于更新UI的状态。一般情况下,在Activity的onResume()方法中使用Context.registerReceiver()方法来注册一个广播接收器,在onPause()方法中使用Context.unregisterReceiver()方法来注销一个广播接收器。
注册的BroadcastReceiver并非一直在后台运行,一旦事件或者相关的intent传来,就会被系统调用,处理onReceive()方法里面的响应事件。



BroadcastReceiver使用demo下载地址: http://download.csdn.net/detail/qq_33721382/9907420


参考文献:
1、张冬玲,杨宁. Android应用开发教程:清华大学出版社,2013年4月第1版:287-289

猜你喜欢

转载自blog.csdn.net/qq_33721382/article/details/75763592