Android中的广播机制

   目前在App开发中的消息全局通知方案有以下几种:系统广播,观察者和eventbus等第三方开源工具。

观察者和eventbus都只能用于应用内的消息通信,他们之间的区别主要在于实现方式的不同

。观察者是由用户通过handler自己实现一套,维护和扩展方便,但是一般不支持优先级和sticky等

原生广播特性,而且随着业务逻辑复杂度增加,监听接口会迅速膨胀

。eventbus等第三方开源工具功能使用简单,功能也要强大一些,支持优先级和sticky等原生广播特性

。但是由于是使用第三方库所以在不了解其实现原理的情况下bug调试跟踪会变得困难,

而且更新库(接口或者一些属性有变动的话)可能会影响到代码的大面积改动

。broadcast不仅支持应用内通信也支持不同应用进程之间的通信。但是由于其底层使用binder来实现,

所以效率上与前两者相比要低一些。当然broadcast最大的优势还是在对系统事件的监听上,

这是其他两个方案没法办到的。所以关于消息通信方案的选择上,

需要根据自己的需求来选择合适的方案。当需要App应用内通信时,优先选择观察者或者Eventbus,

当需要进程间通信或者监听系统广播事件时,选择Broadcast。

另外再提一下LocalBroadcastManager这个类,它是一个本地广播管理器,

估计是Android考虑到原生Broadcast的效率问题而提供的一个轻量级的广播。

它主要是解决App应用内通信的问题,采用handler实现,跟观察者的实现方案类似,

什么是广播:

广播广播。广而告之。比如通知栏里显示的QQ啊。音乐啊。未接来电啊、

、都是从他们各自的软件广播出来的事件。android系统接收广播显示。

一、广播的分类,按有无顺序区分,可以分为:标准广播、有序广播。

(1)标准广播。就是多个广播接收者,接收到广播是无序的,没有规定谁先谁后。

按理想状况来说,是同一时间接收到系统发出的广播。

(2)有序广播。在广播接收者,注册添加这条广播时,有增加了优先熟悉的设置。优先级高的先接收,优先级高的广播接收者,还可以控制是否将广播往下继续传递;

为什么用广播:

在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,

或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。

这个广播跟我们传统意义中的电台广播有些相似之处

在那里用广播:

关于消息通信方案的选择上,需要根据自己的需求来选择合适的方案。

当需要App应用内通信时,优先选择观察者或者Eventbus,

当需要进程间通信或者监听系统广播事件时,选择Broadcast

如何用广播:

广播的两种注册方式:

静态注册和动态注册

两种注册广播的区别:

1)第一种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

    2)第二种不是常驻型广播,也就是说广播跟随程序的生命周期。

*动态注册优先级



广播的生命周期:

广播接收器仅有一个回调方法:

voidonReceive(ContextcurContext, Intent broadcastMsg)

当一个broadcast信息到达该receiver,Android调用它的onReceive()方法并将含有该广播信息的intent 对象传递它。Broadcast receiver仅仅在执行该方法时才被认为是活跃的。当onReceive()返回后,它又处于非活跃状态。也就是说,它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束。

一个包含活跃的broadcast receiver的进程会被保护起来不被杀死。但是一个仅仅含有非活跃组件的进程,在它消耗的内存被其它进程需要时可能随时被系统杀死。

广播接收器的生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息。当该broadcast信息的响应很耗时时会存在问题,这时应该单独给他一个线程运行,而不是在其他组件所在的与用户交互的线程中。如果onReceive()生成该线程后返回,整个进程,包括那个新的线程,都被判断为非活跃的(除非该进程里的其他组件是活跃的),归入了可以被杀死的一类。解决该问题的答案是使用onReceive()开始一个service,让该service进行该处理,那样一来,系统就会知道该进程里仍有活跃的处理在进行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容