Android四大组件简单理解——广播(broadcast receiver)

一、广播(broadcast receiver):属于Android四大组件之一,是一个全局的监听器。你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或数据网络可用是),进行接收并做出响应。广播接收区没有用户界面。然而,它可以启动一个Service或者Activity来响应他们接收的信息,或者NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,列如闪动背灯、震动,播放声音等,一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取信息。

  1、 分类: Android广播分为两个角色:广播发送者和广播接受者。

  2、 作用:监听/接收应用App发出的广播消息,并做出响应。

  3、应用场景:Android不同组件的通信(含:应用内/不同应用之间)

                         多线程通信

                         与Android系统在特定情况下的通信,如:电话呼入时,网络可用时。

 4、实现原理:

      (1)、采用的模型

             Android中的广播使用了设计模式中的观察者模式/基于消息的发布/订阅事件模型,因此,Android将广播的发送者和接收者解耦,使得系统方便集成,更易扩展。

     (2)、模型讲解

              模型中有三个角色

                消息订阅者(广播接受者:BroadcastReceiver ),

                消息发送者(广播发送者:Context.sendBroadcast()),

                消息中心(AMS:即Activity  Manager  Service)。

      (3)、原理:    

原理示意图

         原理描述:

           a、广播接收者,通过Binder机制在AMS注册。

           b、广播发送者,通过Binder机制想AMS发送发送广播。

           c、AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者。(寻找依据:intentFilter/Permission)。

           d、AMS将广播发送到合适的广播接收者相应的消息循环队列中。

           e、广播接收者通过消息循环拿到此广播,并回调 onReceiver()。

         特别注意:广播发送者和广播接收者的执行都是异步的,即广播发送者不会关心有无接收者接收,也不确定接收者何时才能接收到。

   5、广播的注册方式:静态注册和动态注册

       (1)、静态注册:清单文件注册

           注册方式:在AndroidManifest.xml里通过<receiver>标签声明

           区       别:静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的,也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对他起作用。

            代      码:

静态注册示例代码

      (2)、动态注册:代码中注册

              注册方式:在代码中调用Context.registerReceiver()方法

              区       别:动态注册广播接收器的特点是当用来注册的Activity关闭后,广播也就失效了。     

             代       码:

动态注册是示例代码

          特别注意:动态广播最后在Activity的onResum()注册,onPause()注销。原因:

       1、对于动态广播,有注册就必然有注销,否则会导致内存泄漏。重复注册,重复注销也不被允许。

        2、在onResum()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄漏。不在onCreate()&onDestory()或onStart()&onStop()注册、注销,是因为:当系统因为内存不足(优先级更高的应用需要内存)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop()、onDestory()就不会在执行,当再回到此Activity时,是从onCreate()开始执行。

       3、假设我们将广播的注销放在onStop(),onDestory()方法里面,有可能在Activity被销毁后还未执行onStop(),onDestory()方法,即广播任还未注销,从而导致内存泄漏。但是onPause()一定会被执行,从而保证了广播在App死亡前一定会被注销,从而防止内存泄漏。

5、广播接收者和广播发送者。

    (1)、广播接收者:简单的说,就是接受广播意图的java类,此java类继承BroadcastReceiver类,重写public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据;

       广播意图是通过Context.sendBroadcast(Intent intent)或Contetxt.sendOrderedBroadcast(Intent intent)发送的意图,通过这个语句,能够广播给所以满足条件的组件,比如intent设置了action="com.xiazdong"则所有在AndroidManifest.xml中设置过<action android:name="com.xiazdong"/>的广播接收者都能够接收到广播;

    注:onReceive方法必须在10秒内完成,如果没有完成,则抛“Application No Response”当广播接收者onReceive方法需要执行很长时间时,最好将此耗时工作通过Intent发送给Service由Service完成,并且不能使用子线程解决,因为BroadcastReceiver是接收到广播后才创建的,并且生命周期很短,因此子线程可能在没有执行完就已经被杀死了。

  (2)、广播发送者:

通常广播发送方就是调用Context.sendBroadcast()的程序,而广播接收者就是继承BroadcastReceiver的程序;

通常广播发送方都是通过隐式意图,这样才能发送给多人;

广播发送方分为普通广播和有序广播;

同步广播:发送方发出后,几乎同时到达多个广播接收者处,某个接收者不能接收到广播后进行一番处理后传给下一个接收者,并且无法终止广播继续传播;Context.sendBroadcast(intent);

有序广播:广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent);

相关文章阅读

Androdi四大组件广播

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

推荐阅读更多精彩内容