美文网首页Android知识
BroadcastReceiver广播机制简(不详)解

BroadcastReceiver广播机制简(不详)解

作者: 冯奕欢 | 来源:发表于2016-07-01 09:17 被阅读97次

    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属性的话,先注册的将先收到广播。
    使用场景
    这里接收短信的广播是有序广播,因此可以设置你自己的广播接收器的级别高于系统原来的级别,就可以拦截短信,并且不存收件箱,也不会有来信提示音。
    有序广播的缺点:效率比较低

    相关文章

      网友评论

        本文标题:BroadcastReceiver广播机制简(不详)解

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