Android四大组件之BroadcastReceiver

作者: 程序员丶星霖 | 来源:发表于2017-03-18 09:45 被阅读92次

Android四大组件之BroadcastReceiver

Android系统的四大组件还有一个BroadcastReceiver,这个组件本质就是一个全局监听器,用于监听系统全局的广播消息。
因为它是一个全局的监听器,所以在实现系统中不同组件之间的通信方面非常方便。

BroadcastReceiver简介

BroadcastReceiver用于接收程序(包括用户开发的程序和系统內建的程序)所发出的Broadcast Intent。启动BroadcastReceiver也需要两步:

  1. 创建需要启动的BroadcastReceiver的Intent。
  2. 调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动指定的BroadcastReceiver。
    当应用程序发出一个Broadcast Intent之后,所有匹配该Intent的BroadcastReceiver都有可能被启动。

由于BroadcastReceiver本质上属于一个监听器,所以实现BroadcastReceiver的方法也是十分简单,只需要重写BroadcastReceiver的onReceive(Context context, Intent intent)方法就可以咯!
指定BroadcastReceiver能匹配的Intent的方法有两种:

  • 使用代码进行指定,调用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法指定。代码如下:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver,filter);
  • 在AndroidManifest.xml文件中配置。代码如下:
<receiver
    android:name=".IncomingSMSReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

每次系统Broadcast事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver实例就会被销毁。

注意:
如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。因此不要在BroadcastReceiver的onReceive()方法内执行耗时操作,否则会弹出ANR(Application No Response)对话框。

发送广播

在程序中,只需调用Context的sendBroadcast(Intent intent)方法即可发送广播,这条广播将会启动intent参数所对应的的BroadcastReceiver。

广播的分类

Broadcast被分为如下两种:

  • Normal Broadcast(普通广播):Normal Broadcast是完全异步的,可以在同一时刻被所有接受者接收到,消息传递的效率比较高。但缺点是接收者不能将处理结果传递给下一个接收者,而且无法终止Broadcast Intent的传播。
  • Ordered Broadcast(有序广播):Ordered Broadcast的接收者将按预先声明的优先级一次接收Broadcast。Ordered Broadcast接收者可以终止Broadcast Intent的传播,并且传播一旦终止,后面的接收者就无法接收到Broadcast。另外,Ordered Broadcast的接收者可以将数据传递给下一个接收者。

Context提供了如下两种方法用于发送广播:

  • sendBroadcast():发送Normal Broadcast。
  • sendOrderedBroadcast():发送Ordered Broadcast。

对于Ordered Broadcast而言,系统会根据接收者声明的优先级按顺序逐个执行接收者,优先接收到Broadcast的接收者可以终止Broadcast,调用BroadcastReceiver的abortBroadcast()方法即可终止Broadcast。如果Broadcast背前面的接收者终止,后面的广播接收者就再也无法获取到Broadcast了。优先接收的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,然后传给下一个接收者,下一个接收者通过getResultExtras(true)可以获取上一个接收者存入的数据。

接收系统广播消息

除了可以接受用户发送的广播之外,BroadcastReceiver还可以接收系统广播。如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现。

下面是Android中常见的广播Action常量:

  • ACTION_TIME_CHANGED:系统时间被改变。
  • ACTION_DATE_CHANGED:系统日期被改变。
  • ACTION_TIMEZONE_CHANGED:系统时区被改变。
  • ACTION_BOOT_COMPLETED:系统启动完成。
  • ACTION_PACKAGE_ADDED:系统添加包。
  • ACTION_PACKAGE_CHANGED:系统的包改变。
  • ACTION_PACKAGE_REMOVED:系统的包被删除。
  • ACTION_PACKAGE_RESTARTED:系统的包被重启。
  • ACTION_PACKAGE_DATA_CLEARED:系统的包数据被清空。
  • ACTION_BATTERY_CHANGED:电池电量改变。
  • ACTION_BATTERY_LOW:电池电量低。
  • ACTION_POWER_CONNECTED:系统连接电源。
  • ACTION_POWER_DISCONNECTED:系统与电源断开。
  • ACTION_SHUTDOWN:系统被关闭。
    通过使用BroadcastReceiver来监听特殊的广播,就可以让应用随系统执行特定的操作。
好了广播就到这吧,加油!!!
我的微信公众号.jpg

相关文章

网友评论

    本文标题:Android四大组件之BroadcastReceiver

    本文链接:https://www.haomeiwen.com/subject/hsoenttx.html