四大组件之三 -- BroadcastReceiver

一、BroadcastReceiver是什么。

Android应用程序可以发送或接收来自Android系统和其他Android应用程序的广播消息,类似于发布订阅设计模式。例如,当各种系统事件发生时,例如系统启动或设备开始充电时,Android系统会发送广播。应用程序还可以发送自定义广播,例如,通知其他应用程序可能感兴趣的内容(例如,一些新数据已被下载)。

应用程序可以注册以接收特定的广播。当发送广播时,系统自动将广播路由到已订阅接收该特定类型的广播的应用。

一般来说,广播可以用作跨应用程序和正常用户流之外的消息传递系统。

系统广播

当系统发生各种系统事件时,系统会自动发送广播,例如系统切换飞机模式时。系统广播将发送到订阅接收事件的所有应用程序。

广播消息本身被包裹在Intent其动作字符串识别发生的事件的对象(例如android.intent.action.AIRPLANE_MODE)中。该意图还可以包括捆绑到其额外字段中的附加信息。例如,飞机模式意图包括一个布尔值,表示飞机模式是否打开。

二、接收广播

应用程序可以通过两种方式接收广播:通过清单声明注册和上下文注册。

清单声明注册

1、指定应用程式清单中的<reveiver>元素。

2、子类BroadcastReceiver和实现onReceiver(Context context,Intent intent)。以下示例中的广播接收器记录并显示广播的内容:

上下文注册

1、创建一个实例BroadcastReceiver。

BroadcastReceiverbr=newMyBroadcastReceiver();

2、创建Intentfilter并通过调用注册接收方RegisterReceiver(BroadcastReceiver , IntentFilter);

IntentFilterfilter=newIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br,filter);

3、要停止接收广播,请注销unregisterReceiver(android.content.BroadcastReceiver)。当您不再需要它或上下文不再有效时,请务必注销接收器。

注意在哪里注册和注销接收者,例如,如果您在onCreate(Bundle)使用活动的上下文中注册接收方,则应该取消注册,onDestory()以防止将接收者从活动上下文泄漏出来。如果您在其中注册了一个接收器onResume(),您应该取消注册,onPause()以防止多次注册(如果您不想在暂停时接收广播,并且可以减少不必要的系统开销)。不要注销onSaveInstanceState(Bundle),因为如果用户在历史堆栈中移回,则不会调用它。

三、发送广播

1、sendOrderedBroadcast(Intent,String)方法一次向一个接收器发送广播。随着每个接收机依次执行,它可以将结果传播到下一个接收机,或者它可以完全中止广播,使得它不会被传递到其他接收机。运行的订单接收器可以通过匹配的意图过滤器的android:priority属性来控制;具有相同优先级的接收器将以任意顺序运行。

2、sendBroadcast(Intent)方法以未定义的顺序向所有接收者发送广播。这被称为普通广播。这更有效率,但是意味着接收机不能从其他接收机读取结果,传播从广播接收到的数据,或者中止广播。

3、LocalBroadcastManger.sendBroadcast()方法向与发送方相同的应用程序的接收方发送广播。如果您不需要跨应用发送广播,请使用本地广播。实施效率更高(无需进行进程间通信),您无需担心与能够接收或发送广播的其他应用程序相关的任何安全问题。

四、接收权限

如果您在注册广播接收者时指定了权限参数(与清单registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)中的标签一起使用),则只有通过其清单中的标签请求许可的广播商才能发送接收器的意图。

例如,假设您的接收应用程序具有清单声明的接收器,如下所示:

或者您的接收应用程序具有上下文注册的接收器,如下所示:

安全考虑和最佳做法

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

推荐阅读更多精彩内容