Android四大组件之Broadcast Receiver

什么是Broadcast

在android中,通过广播(broadcast可以通知其他广播接收者某个时间发生了,比如电源不足、信号不好等。首先,我们看一个简单的demo,该demo实现类一个自定义broadcast。


发送端这个activity中创建了一个按钮,当按钮被按下的时候通过sendBroadcast()发送一个broadcast。

public class BroadcastTest extends Activity { 
public static final String NEW_LIFEFROM_DETECTED = “com.android.broadcasttest.NEW_LIFEFROM”; 
public void onCreate(Bundle savedInstanceState) { 
…… Button btn0 = (Button)findViewById(R.id.btn0); 
btn0.setOnClickListener(new OnClickListener() { 
public void onClick(View v) { 
Intent it = new Intent(NEW_LIFEFROM_DETECTED); 
sendBroadcast(it); 
} 
}); 
} 
…… 
}

接收端在onReceive()中实现类当接收到broadcast所做的动作。

Public class MyBroadcastReceiver extends BroadcastReceiver { 
…… 
Public void onReceive(Context context, Intene intent){ 
// TODO 
} 
…… 
}

在receiver的action中定义了该receiver能够接受的广播,Manifest.xml定义部分:

<receiver android:name=”.MyBroadcastReceiver”> 
<intent-filter> 
<action android:name=”com.android.broadcasttest.NEW_LIFEFROM” /> 
</intent-filter> 
</receiver>

Android中是如何实现Broadcast机制的

Broadcast机制ishi鲫鱼一种注册方式的,Broadcast Receiver将其特征描述并注册在系统中。根据注册时机,可以分为两类,网上有人称之为冷注册和热注册。

  • 冷注册,就是Broadcast Receiver的相关信息写在配置文件中,系统会负责在相关事件发生的时候及时通知到该Broadcast Receiver。这种模式适合于这样的场景:某事件发生 -> 通知Broadcast -> 启动相关处理应用。比如,监听来电、邮件、短信之类的,都隶属于这种模式。

  • 热注册,顾名思义,注册这样的事情都是由应用自己来处理的,通常是在OnResume事件中通过registerReceiver进行注册,在OnPause等事件中通过unregisterReceiver反注册,通过这种方式使其能够在运行期间保持对相关事件的关注。比如,一款优秀的词典软件,可能会有在运行期间关注网络状况变化的需求,使其可以在有廉价网络的时候优先使用网络查询词汇,在其他情况下,首先通过本地词库来查词。而这样的监听,只需要在其工作状态下保持就好,不运行的时候,管你是天大的网路变化,与我何干。其模式可以归结为:启动应用 -> 监听事件 -> 发生时进行处理。
前面的Demo中用的就是冷注册。热注册的code如下:

onCreate时,声明一个BroadcastReceiver。

BroadcastReceiver mReceiver=new BroadcastReceiver(){ 
Public void onReceive(Context context,Intent intent){ 
//收到Broadcast会跑到这里 
} 
}

OnResume时,通过registerReceiver注册。

IntentFilter mfilter=new IntentFilter(); 
mfilter.addAction(Intent.ACTION_SCREEN_OFF); 
registerReceiver(mReceiver,mfilter);

OnPause时,通过unregisterReceiver反注册。

unregisterReceiver(mReceiver);

registerReceiver, unregisterReceiver的内部实现,可以参考frameworks/base/services/java/com/android/server/am/ActivityManagerService.java。
除了接收消息的一方有多种模式,发送者也有很重要的选择权。通常,发送者有两类:
 系统本身,Android定义了一组的Standard Broadcast Actions,称为系统Broadcast消息,参考http://androidappdocs.appspot.com/reference/android/content/Intent.html。
 自定义应用通过的接口Context.sendBroadcast或Context.sendOrderedBroadcast也可以发送Broadcast。前者发出的称为Normal broadcast,所有关注该消息的Receiver,都有机会获得并进行处理;后者放出的称作Ordered broadcasts,顾名思义,接受者需要按资排辈,排在后面的能否收到广播,需要看前面的处理方式。
需要注意的是,当Broadcast Receiver接收到相关的消息,在OnReceive中不要执行很消耗时间的操作,通常把消耗时间的操作放到一个Service中,在OnReceive中启动该Service。
虽然Broadcast整个逻辑不复杂,却是足够有用和好用,它统一了Android的事件广播模型,更多Broadcast Receiver相关内容,可以参考:http://androidappdocs.appspot.com/reference/android/content/BroadcastReceiver.html。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值