什么是broadcastreceiver?

    broadcastreceiver是一种在应用之间传输信息数据的一种机制。是Android四大组件之一。那么broadcastreceiver是如何实现应用间数据信息传递呢?先简单的描述一下,broadcastreceiver的名字已经说明它的原理,它就是一个广播。广播很容易理解,就是有人在广播里说了一条命令,然后一定范围内的人员听到了,判断是否跟自己有关,有关的人员就去按照命令执行事务,无关的人则对于广播忽略。

    broadcastreceiver的机制跟广播如出一辙,发布命令的可以是程序员自定义的应用程序,也可以是系统自带的一些应用程序,自定义的应用想发布广播则需要调用方法Context.sendBroadcast(intent),然后就是接受命令的人了,接受广播需要两点,一是是否跟自己有关,二是执行命令,对于第一点,需要定义intent-filter,叫做意图过滤器,

第二点,则是需要编写一个继承BroadcastReceiver类的java类,重写onReceive(Context context, Intent intent)方法。

广播发送:

    广播发送有两种情况,一种是普通广播(Normal broadcasts),另一种称为有序广播(Ordered broadcasts)。广播发送为了能让更多的应用接受到,一般采用隐式意图。

    同步广播:发送方发出后,几乎同时到达多个广播接收者处,某个接收者不能接收到广播后进行一番处理后传给下一个接收者,并且无法终止广播继续传播;                               Context.sendBroadcast(intent);

    异步广播:广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent);

广播接收:

   广播接收

public class Receiver extends BroadcastReceiver{  
    public void onReceive(Context context, Intent intent) {  
        Bundle bundle = intent.getExtras();  
        ...  
    }  
}

注:广播接收器只能生命周期只有10秒,如果onReceive在10秒内没有执行完成,就会报错。如果程序想要广播接收器执行10秒以上,那么可以启动一个Service,有Service来执行,不可以新建一个子线程来执行,因为10秒之后广播接收器就会被杀死,相应的子线程也会被杀死。当然广播接收器也可以启动一个Activity,很典型的就是闹钟。

广播接收器注册:

       发送者和接受者都有了,那么接下来就是连接这两者之间的桥梁了,就是意图过滤器。

       意图过滤器被打包在广播接收器注册里,而广播接收器注册有两种方式,一种叫做动态注册,一种叫做静态注册,不同接收器有不同的效果。

       静态注册,在 AndroidManifest.xml中注册:

< receiver android:name = ".MyBroadcastReceiver" >
           < intent-filter android:priority = "900" >
              < action android:name = "cn.demo.jsdsm" />
           </ intent-filter >
</ receiver >

上面代码中receiver的name是继承于广播接收器的类名,被intent-filter包裹的是意图过滤器,priority是优先级,优先级是在有序广播时用到,action的name则是一个字符串,由广播发送者设置。

此种方法注册,不管应用程序是否启动,都可以接收到广播。

        动态中注册:

receiver=new MyReceiver();  
         IntentFilter filter=new IntentFilter();  
         filter.addAction(ACTION);  
         //动态注册BroadcastReceiver  
         registerReceiver(receiver, filter);

首先new一个广播接收器的对象(receiver),在new一个意图过滤器对象(filter),并为该意图过滤器添加动作,然后调用方法registerReceiver注册广播接收器。

此种方法注册,可以关闭监听,调用方法unregisterReceiver(receiver);。

一般建议在Activity启动的时候开启监听,在Activity退出的时候关闭监听。