浅谈BroadcastReceiver

在安卓开发中,broadcast是一种APP直接传输信息的机制。它是对广播进行过滤并接受响应的一类组件。它可以运用于接收广播intent,广播intent发送通过调用sendbroadcast/sendorderedBroadcast来实现。通常一个广播intent可以被订阅此intent的多个广播接收者所接收。

 比如我静态注册一个SDcardunmountedreceiver的广播代码如下:

在清单文件中声明<receiver>,需要在其中配置<intent--filter>指定接收广播的动作action

或者动态注册,在JAVA代码中注册:

两种注册的区别:代码注册也就是动态注册,它不是一个常驻的广播,也就是说他的广播是跟随着程序的生命周期,一旦代码所在进程被杀死,广播接收者就失效。而在清单文件中注册的静态广播是常驻型,在当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。在平时我们手机中,需要启动一次才能接受到广播,它才会生效。


安卓中常见的广播

监听拨打电话广播




监听系统开机的广播,监听安装和卸载程序的广播,拦截短信等。

发送自定义广播

无序广播不可以被拦截,所有接收无序广播的广播接收者在此广播被发送时均能接收此广播,并且是同时接收。无序广播使用sendbroadcast方法来发送,核心代码如下:


这个intent的action可以是自定义的动作。那么接收者也要定义发送广播的意图动作。

注意:符合某广播条件的所有广播接收者的特点:无序、无优先级、不可中断、不可传递数据。

   广播时可设置接收者权限,仅当接收者含有权限才能接收。

   接收者的<receiver>也可以设置发送方权限,只接收含有权限应用的广播Receiver节点属性

   发送广播是,通过intent.setFlag(intent.flag_include_stopped_packeages),包含从未启动过的程序,这样的设置,可以让从未启动的接收者也收到广播。

有序广播

有序广播可以被拦截或者添加数据,优先级高的接收者可以拦截低优先级,使用abortBroadcast,添加数据:通过bundle传递。前面的接收者可以将数据通过setResultExtras(Bundle)方法存进结果对象,然后传递给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true)可以获取上一个接收者存入在结果对象中的数据。

谷歌规定的优先级是1000~~负1000,系统默认优先级是0。


粘性广播(sendstickBroadcast),号称是阴魂不散的广播,它会一直等待intent指定的事件处理完毕才会消失。他需要API的权限BROADCAST_STICKY。它不会像普通广播那样10秒钟以后就会被干掉。

注意一些细节问题:

1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值