感谢:
http://www.devdiv.com/home.php?mod=space&uid=14682&do=blog&id=3776
在android中,通过广播(broadcast)可以通知其他广播接受者某个事件发生了。比如电源强度,信号强度等。
Broadcast机制是基于一种注册方式的,Broadcast Receiver将其特征描述并注册在系统中。根据注册时机,可以分为两类,网上有人称之为静态注册和动态注册。
静态注册,就是Broadcast Receiver的相关信息写在配置文件中,系统会负责在相关事件发生的时候及时通知到该Broadcast Receiver。这种模式适合于这样的场景:某事件发生
-> 通知Broadcast -> 启动相关处理应用。比如,监听来电、邮件、短信之类的,都隶
属于这种模式。 这个方式实现如下:
(1)接收广播
Public class MyBroadcastReceiver extends BroadcastReceiver {
Public void onReceive(Context context, Intene intent){
// TODO
}
(2)发送广播
Intent it = new Intent(NEW_BROADCAST_FILTER);
sendBroadcast(it);
(3)配置广播
在receiver的action中定义了该receiver能够接受的广播,Manifest.xml定义部分:
<receiver android:name=”.MyBroadcastReceiver”>
<intent-filter>
<action android:name= NEW_BROADCAST_FILTER />
</intent-filter>
</receiver>
动态注册,注册这样的事情都是由应用自己来处理的,通常是在OnResume事
件中通过registerReceiver进行注册,在OnPause等事件中通过unregisterReceiver取消注
册,通过这种方式使其能够在运行期间保持对相关事件的关注。比如,判断网络变化,有些应用会在运行期间关注网络状况变化的需求,使其可以在有网络的时候优先使用网络,在其他情况下,首先通过本地数据。而这样的监听,只需要在其工作状态下保持就好,不运行的时候,管你是天大的网路变化,与我何干。其模式可以归结为:启动应用 -> 监听事件 -> 发生时进行处理。 动态注册广播方式如下:
(1)声明一个BroadcastReceiver
BroadcastReceiver mReceiver=new BroadcastReceiver(){
Public void onReceive(Context context,Intent intent){
//收到Broadcast会跑到这里
}
}
(2) OnResume时,通过registerReceiver注册。
IntentFilter mfilter=new IntentFilter();
mfilter.addAction(NEW_BROADCAST_FILTER);
registerReceiver(mReceiver,mfilter);
(3)OnPause时,通过unregisterReceiver反注册。
unregisterReceiver(mReceiver);
android中发送广播有两种方式,Context.sendBroadcast和Context.sendOrderedBroadcast,前者发出的称为Normal broadcast,所有关注该消息的Receiver,都有机会获得并进行处理;后者放出的称作Ordered broadcasts,顾名思义,接受者需要按资排辈,排在后面的能否收到广播,需要看前面的处理方式,如果前面的Receiver阻止了这个消息继续广播,排在后面的就不会在接收到这个广播,短信广播就是Ordered broadcasts。
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="1999">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
Ordered broadcasts根据priority值确定优先级,值越大优先级越高,如果你的短信程序中priority最大,接收到短息广播后阻止了其继续广播,就达到了拦截短信的效果。
最后需要注意的是,当Broadcast Receiver接收到相关的消息,在OnReceive中不要执行很消耗时间(通常不大于5秒)的操作,通常把消耗时间的操作放到一个Service中,在OnReceive中启动该Service。