前言
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
注册BroadcastReceiver有两种方式:
- 静态注册
- 动态注册
静态的在AndroidManifest.xml中用
另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用
其实所谓的静态注册,动态注册,是指接收广播的时候,是静态注册接收还是动态注册接收,发送的时候不分静态,动态。以发送intent为例,一共分4种情况,以每次注册两个Broadcast为例:
情况一,注册2个静态Broadcast
如果是静态注册的,接收的一定是某一个类继承BroadcastReceiver。
2个java文件如下:
BroadcastActivity.java广播发送的Activity中,定义两个按钮,并分别绑定监听事件,封装数据到intent中,发送广播。
|
|
BroadcastRecTest.java广播接受的Activity中,覆写onRecive方法,接受广播,取得intent中的数据。
|
|
AndroidManifest.xml中的相关配置如下
运行结果:
注意,静态注册的broadcast运行有点慢:
情况2,一个静态,一个动态注册Broadcast
BroadcastActivity.java广播发送的Activity中,定义两个按钮,并分别绑定监听事件,封装数据到intent中,发送广播。
|
|
BroadcastRecTest.java广播接受的Activity中,覆写onRecive方法,接受广播,取得intent中的数据。
|
|
AndroidManifest.xml
true是静态注册的,在Android.xml中注册的,false是动态注册的,在java代码中注册的。
情况三、两个都是动态注册的,在同一个Activity里面既发送,又接收(不同Activity中亦可)。
动态注册不需要一个类继承BroadcastReceiver这个类了,直接new一个对象即可。
AndroidManifest.xml中无须注册receiver,而是在代码中完成。
运行结果:
情况4,sendBroadcast的时候加权限,以2个都动态注册为例
|
|
发送的时候加了蓝牙权限,
若在使用sendBroadcast()的方法是指定了接收权限,则只有接收方的包内–在AndroidManifest.xml中用
同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在接收方的包内的AndroidManifest.xml中 用
AndroidManifest.xml中无须注册receiver。
运行结果:
两个Application间,发送广播,(以静态为例)
发送端:
|
|
接收端:
另一个application
1、Activity
2、BroadcastReceiver
3、AndroidManifest.xml
运行Application1,点击button,Application2广播接收端会收到这个广播,打印log信息(但不会显示BroadcastReceiverTest1Activity的界面),还是显示SenderTest1Activity的界面,
Log信息如下:
接收端Application3,用动态方式接收。(把Application1的发送的action变成(“su.broadcast.send2”);)
|
|
先运行Application3,不能退出(back),否则就unregisterReceiver了,也就不能收到发送端发送的广播了。再运行Application1,点击button,发送广播,log信息如下:界面还是Application1的界面UI
对于静态Application2接收广播来说,back之后也能接收到发送端发过来的广播!
注意:发送广播并不能调起另一个Activity!一直显示的都是发送广播的那个Activity的UI!!
总结:
以发送intent为例,发送广播都用sendBroadcast(intent);
静态注册接收的时候,只需要
- (1)得到action,如:String action = intent.getAction();
- (2)判断action类型,做出相应的动作。
动态注册接收的时候,需要:
- (1)IntentFilter intentFilter= new IntentFilter();
- (2)intentFilter.addAction(。。);可以添加多个
- (3)注册接收,registerReceiver(BroadcastReceiver对象,intentFilter);别忘了在其他需要的地方取消注册接收!!!
- (4)得到action,如:String action = intent.getAction();
- (5)判断action类型,做出相应的动作。
参考文档:
http://www.cnblogs.com/snowdrop/articles/1906709.html
http://www.cnblogs.com/playing/archive/2011/03/23/1992030.html