BroadcastReceiver 笔记

BroadcastReceiver,Android系统的四大组件之一,这种组件本质上就是一种全局的监听器,用于监听系统全局的广播消息。由于BroadcastRecevier是一种全局的监听器,因此它可以非常方便地实现组件之间的通信。例如我们希望客户端程序与startService()方法启动的Service之间的通信,就可以借助BroadcastRecevier来实现。

1、BroadcastRecevier简介

BroadcastRecevier用于接收程序(包括用户开发的程序和系统内建的程序)所发出的Broadcast Intent,启动BroadcastRecevier需要两步骤:

(1)、创建需要启动的BroadcastRecevier的Intent

(2)、调用Context的sendBroadcast()或sendOrderedBroadcast()方法

BroadcastRecevier是系统级的监听器,拥有自己的进程,只要存在与之匹配的Intent被广播出来,BroadcastRecevier总会被激发。

由于BroadcastRecevier本质上是一个监听器,因此实现BroadcastRecevier的方法也十分简单,只要重写BroadcastRecevier的onRecevier(Context context,Intent intent)方法即可。

一旦实现了BroadcastRecevier,接下来就应该指定BroadcastRecevier能匹配的Intent,此时有两种方式:

1、使用代码进行指定,调用BroadcastRecevier的Context的registerReceiver(BroadcastRecevier recevier ,InterFilter filter)方法指定。例如如下代码:

InterFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomingSMSReceiver();

registerReceiver(receiver,filter);

2、在AndroidManifest.xml文件中配置,例如如下代码:

<receiver name=".IncomingSMSReceiver">

<intent-filter>

<action name="android.provider.Telephony.SMS_RECEIVED">

</receiver>

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

如果BroadcastReceiver的onReceiver()方法不能在10秒内执行完成,Android系统会认为该程序无响应,所以不要在onReceiver()方法里执行耗时的操作,否则会报ANR(Application No Response)的对话框。

如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成操作,不应考虑使用新线程去完成耗时的操作,因为BroadcastReceiver本身的生命周期很短,可能出现的情况是子线程可能还没有结束,BroadcastReceiver就已经退出了。

如果BroadcastReceiver所在的进程结束,虽然该进程内还有用户启动的新线程,但由于该进程内不包含任何活动组件,因此系统可能在内存紧张时优先结束该进程,这样就可以导致BroadcastReceiver启动的子线程不能执行完成。

2、发送广播

context.sendBroadcast(Intent intent)


3、有序广播

Broadcast有两种:

(1)、Normal  Broadcast (普通广播):是完全异步的,可以在同一时刻(逻辑上)被所以接受者收到,消息传递的效率比较高。但缺点是接受者不能将处理的结果传递给下一个接受者,并且无法终止Broadcast Intent的传播。

(2)Ordered  Broadcast(有序广播):Ordered Broadcast 的接收者将按预先声明的优先级priority依次接收Broadcast,取值范围为-1000~1000.另外,Ordered Broadcast的接收者可以将数据传递给下一个接收者。

发送广播的两种方法:

sendBroadcast();

sendOrderedBroadcast():

不仅如此,对于Oreder Broadcast而言,优先接收到的Broadcast的接收者可以通过setResultExtras(Bundle bundle)方法将处理结果存入Broadcast中,然后传给下一个接收者,下一个接收者通过代码Bundle bundle = getResultExtras(true)获取上一个接收者存入的数据。

开机自动运行的Service,定义一个BroadcastReceiver,监听系统开机广播,<action android:name="android.intent.action.BOOT_COMPLETED" />

并添加访问系统开机事件的权限<use-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

短信提醒:当系统收到短信时,系统会对外发送一个有序广播,该广播的Intent的Action为android.provider.Telephony.SMS_RECEIVED。

手机电量提示:当手机电量发生改变时,系统会对外发送Intent的action为ACTION_BATTERY_CHANGED常量的广播;当手机电量过低时,系统对外发送Intent的action为ACTION_BATTERY_LOW常量的广播。

P 427




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值