回头看Android之broadcastreceiver

来源:互联网 发布:java web信息管理系统 编辑:程序博客网 时间:2024/04/29 04:38

什么是broadcastreceiver
broadcastreceiver被译为“广播接收者”。其实我们从这个名字就能够很容易的想到,既然有广播接收者,那一定有广播的发送者。而这个广播的发送者,我们通常认为是Android系统。
首先来看几个例子。我们在日常使用手机的时候,应该会遇到这么以下几个场景:
1、手机电量不足,系统会主动提示你:低电量,请充电;
2、手机开机,咨询类的app会主动推送给你当天的头条热点信息;
3、在线看视频时,突然断网了,手机会主动停止播放视屏,并提示你没有网了。
相信,这些场景大家都曾经遇到过。那么这种机制到底是如何实现的呢?
实际上,很简单。在这些场景中,Android系统充当了一个发送消息的人。当系统出现种种情况时,Android系统会把发生的情况以广播的形式发送出去,通知相应的app做出响应。
Android的广播机制实际上是设计得非常出色的。采用这种机制,很多原本需要开发者自己做的事情现在都不需要了,我们需要做的就是等待通知并做出响应就OK了。实际上,虽然我们也可以自己发送广播,但这种情况出现的几率很小(就我目前的经历来说,即便涉及组件内通信,也没有采用broadcastreceiver机制)。在开发中,我们更多的是去响应系统发送给我们的广播。

实现机制与流程
正如我在前面几篇文章中所谈到的那样,Intent作为Android系统中一种极其重要的消息传递机制,借助它,可以实现跨进程的通信和交互。那么在这里,broadcastreceiver的实现当然也是使用了Intent。在实际中,使用broadcastreceiver也非常简单。
OK,Talk is cheap,show me the code.

第一步:创建BroadcastReceiver的子类:    由于BroadcastReceiver本质上是一种监听器,所以创建BroadcastReceiver的方法也非常简单,只需要创建一个BroadcastReceiver的子类然后重写onReceive (Context context, Intentintent)方法即可。    具体代码如下:    public class BootCompleteReceiver extends BroadcastReceiver {  private static final String TAG = "BootCompleteReceiver";  @Override  public void onReceive(Context context, Intent intent) {      Intent service = new Intent(context, MsgPushService.class);      context.startService(service);      Log.i(TAG, "Boot Complete. Starting MsgPushService...");  }  }  
第二步:注册BroadcastReceiver  一旦实现了BroadcastReceiver,接下就应该指定该BroadcastReceiver能匹配的Intent即注册BroadcastReceiver。这种方法是在配置AndroidManifest.xml配置文件中注册,通过这种方式注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发程序还是会被系统自动调用运行。例如:<!-- 在配置文件中注册BroadcastReceiver能够匹配的Intent -->  然后我们需要在AndroidManifest.xml中配置相关信息:<!-- 开机广播接受者 -->  <receiver android:name=".BootCompleteReceiver">      <intent-filter>          <!-- 注册开机广播地址-->          <action android:name="android.intent.action.BOOT_COMPLETED"/>          <category android:name="android.intent.category.DEFAULT" />      </intent-filter>  </receiver>  <!-- 消息推送服务 -->  <service android:name=".MsgPushService"/> 

OK。整个流程就是这样
系统状态变化—-》系统发送广播—-》被广播接收器接受到(manifest中的receive和Intent-filter)—-》执行对应的onReceive方法。

其他的更具体的细节,请查看这篇文章
ps:本文参考了这篇文章

原创粉丝点击