什么是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退出的时候关闭监听。