Android——Broadcast Receiver

来源:互联网 发布:淘宝儿童模特 编辑:程序博客网 时间:2024/05/18 06:19

休假期间整理的资料,部分参考网上内容。

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)配置广播

receiveraction中定义了该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);

3OnPause时,通过unregisterReceiver反注册。

unregisterReceiver(mReceiver);

 android中发送广播有两种方式,Context.sendBroadcastContext.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

http://www.devdiv.com/home.php?mod=space&uid=14682&do=blog&id=3776