BroadcastReceiver广播机制简(不详)解

BroadcastReceiver,四大组件之一,本质上就是一种全局的监听器,用于监听系统全局的广播消息。由于BroadcastReceiver是一种全局的监听器,因此它可以非常方便地实现系统中不同组件之间的通信。

生命周期

它的生命周期不像Activity或者Service一样有一个完整的周期,广播注册之后,当触发onReceive()方法之后,就会被销毁。别以为你能在onReceive()方法内执行耗时的操作,如果onReceiver()方法不能在10秒内执行完成,Android会认为该程序无响应。Yeah,so 生命周期如此之短,so 不要在onReceiver()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)的对话框。那怎么办呢?
如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。而不是使用子线程的方法来解决,因为BroadcastReceiver的生命周期很短(在onReceive()执行后BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束BroadcastReceiver就先结束了。如果BroadcastReceiver结束了,它的宿主进程还在运行,那么子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。

注册方法

BroadcastReceiver用于监听被广播的事件(Intent)为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:

  • 在应用程序的代码当中进行注册(动态注册)。
  • 在AndroidManifest.xml当中进行注册(静态注册)。

记得:动态注册应在Activity或者Service销毁的时候unregisterBroadcast(撤销注册)

有序广播

普通的广播我就不啰嗦了,我们看看有序广播,没用过吧。
看看它的特点:
1.按优先级的不同,优先Receiver可对数据进行处理,并传给下一个Receiver
2.通过abortBroadcast可终止广播的传播
一看特点,我总会想起Java设计模式的责任链模式,呵呵。
使用方法:
优先接收到Broadcast的Receiver可通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,
下一个Receiver 通过 Bundle bundle=getResultExtras(true)方法获取上一个 Receiver传来的数据
我们也可以在某个广播用abortBroadcast()方法切断广播,不传到下一个广播。
优先级的设置,可以通过在intent-filter中设置android:priority属性来设置receiver的优先级,优先级相同的receiver其执行顺序不确定。
如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,先注册的将先收到广播。
使用场景
这里接收短信的广播是有序广播,因此可以设置你自己的广播接收器的级别高于系统原来的级别,就可以拦截短信,并且不存收件箱,也不会有来信提示音。
有序广播的缺点:效率比较低

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 现实中的广播:电台为了传达一些消息而发送广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了。 ...
    stevewang阅读 4,300评论 0 8
  • 广播接收器 是Android的四大组件之一,可见广播在Android中的重要性; 1. 什么是广播? 广播(Bro...
    Lost_Robot阅读 1,978评论 2 10
  • 1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activit...
    JoonyLee阅读 5,761评论 2 51
  • “你又笨又蠢又懒,我不喜欢你了。” “你就像个狗皮膏药,不要缠着我。” 看到这里,你也许会问,发生了什么?事情要倒...
    芊翩一律阅读 1,145评论 0 2
  • 新年第一天 我许下一个愿望 要画满整个屋子 贴满五面墙壁 后来发现 一天100幅都可以 一年一个屋子 也好简单的样...
    天野丢阅读 91评论 0 1