装载请注明出处:http://blog.csdn.net/yegongheng/article/details/18044013
什么是BroadCastReceiver
BroadcastReceiver 中文意思是“广播接收者”,它主要是用于接收应用程序或是系统发送过来的广播并根据广播内容进行相关响应的一类组件。Broadcast在Android系统中应用的非常广泛,比如电池状态的变化、电话的接收、短信的接收、键盘输入法切换和网络连接状态变化都会由系统发送一个广播,然后应用程序通过BroadCastReceiver可以监听这些广播并作出相应的处理。此外,BroadCastReceiver可以通过监听其它应用程序发送的广播接收传递过来的信息进而实现进程间的通信,我们再查看一下BroadcastReceiver的源码可以看到IBinder影子,就不难理解其中的原理了(Android进程通信是用IBinder实现的)。BroadCastReceiver的静态注册和动态注册
要实现一个BroadcastReceiver,就必须和使用Android其它组件一样(Activity、Service和ContentProvider),得在AndroidManifest.xml中进行注册。下面举一个示例,在AndroidManifest.xml中注册BroadcastReceiver,代码如下:
<receiver android:name=".broadcastreceiver.NormalBroadReceiver" >
<intent-filter >
<action android:name="com.fendou.NORMAL_BROADCASTRECEIVER" />
</intent-filter>
</receiver>
以上代码中<intent-filter>中的<action>主要作用是充当广播过滤器的一个过滤标签,可以是自定义也可以由系统提供,并且一个<intent-filter>中可以有多个<action>。BroadcastReceiver除了可以在xml文件中注册外,还可以以代码的形式在类中注册,示例代码如下:
//注册BroadcastReceiver方法
public void filter()
{
IntentFilter mFilter = new IntentFilter();
mFilter.addAction("com.fendou.NORMAL_BROADCASTRECEIVER" );
registerReceiver( mBroadcastReceiver, mFilter);
}
//实例化BroadcastReceiver
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals("com.fendou.NORMAL_BROADCASTRECEIVER" ))
{
//dosomething
}
}
};
以代码方式注册,首先我们得实例化一个Intentfilter和一个BroadcastReceiver对象,然后使用registerReceiver()方法将BroadcastReceiver注册到系统中,很简单吧。对于这两种注册BroadcastReceiver的方式,我们一般将前者称为静态注册,后者则称为动态注册,两者的区别就是前者注册是属于常驻型,就是在应用程序一开启,以该种类型注册的BroadcastReceiver就可以一直接收到系统或其它应用发送过来的广播,即使它的宿主应用退出系统不再中运行,该类型的BroadcastReceiver也能照常工作。而后者由于在类中注册的,所以它的生命周期是跟随类对象的,若该类对象被停止销毁了,在该类中注册的BroadcastReceiver也会随之销毁。两种注册方式都有各自的特点,我们可以根据具体情况来选择需要使用哪种注册方式。
BroadCast的分类
前面讲解了BroadcastReceiver的注册,那么我们可以自定义广播来向注册的BroadcastReceiver发送广播,发送广播的方式一般分为以下四种:
<1>普通广播
发送普通广播是最常见也是使用最多的一种广播发送方式,它的特点就是当有多个BroadcastReceiver同时接收一个广播的时候,它们都是异步接收的的,换句话说就是各个BroadcastReceiver之间接收广播的时候互不干扰,互不影响,由此便可知该广播对于每个BroadcastReceiver来说,各自都无法阻止其它BroadcastReceiver的接收动作。
<2>有序广播
有序广播相对于普通广播的区别就是当有多个BroadcastReceiver同时接收同一个广播时,它们之间会根据注册时在<intent-filter>中设置的android:priority=""优先级属性来排列接收广播的顺序,该属性的数值越大,优先级越高,取值范围是在-1000到1000之间。当没有设置优先级时,接收顺序是随机的。
为了比较普通广播和有序广播的区别,我们接下来使用一个实例来实验一下,以便我们理解得更加深刻。我们打算分别使用(sendBroadcastReceiver())发送普通广播和发送有序广播(sendOrderBroadcastReceiver())的方式同时发送给三个BroadcastReceiver,然后检验两种广播发送方式的特点和不同点。首先定义三个BroadcastReceiver,分别是
OrderBroadcastReceiverFirst、OrderBroadcastReceiverSecond和OrderBroadcastReceiverThird,并为它们设置优先级,如下是它们的注册代码:
<!-- android:priority属性是为每个BroadcastReceiver设置优先级,值越大优先级越大 -->
<receiver android:name=".broadcastreceiver.OrderBroadCastReceiverFirst" >
<intent-filter android:priority="500" >
<action android:name="com.fendou.ORDER_NORMALBROADCASTRECEIVER" />
</intent-filter>
</receiver>
<receiver a