您的位置:首页 > 移动开发 > Android开发

回头看Android之broadcastreceiver

2017-06-12 09:22 281 查看
什么是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:本文参考了这篇文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: