面试题四:BroadcastReceiver详解

 

目录

相关文章:

一、广播

二、实现广播

三、广播实现机制

四、代码实例

1、继承BroadcastReceiver基类

2、注册

五、LocalBroadcastManager详解

六、面试问答

6.1、广播种类

6.2、广播接收者两种注册方式有什么不同


相关文章:

30+ 个 BroadcastReceiver 、ContentProvider 知识点总结(9w阅读量,1k赞,比较细化)

Android四大组件:BroadcastReceiver史上最全面解析(11w阅读量,讲解很详细)

Android面试基础之BroadcastReceiver详解

Android中BroadCastReceiver详解

一、广播

1、定义

BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。

在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。

2、场景

A、同一APP具有多个进程的不同组件之间的消息通信

B、不同APP之间的组件之间的消息通信

3、种类

A、普通广播(Normal Broadcast):即 开发者自身定义 intent的广播(最常用)。

B、系统广播(System Broadcast):Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播;每个广播都有特定的Intent - Filter(包括具体的action)

C、有序广播(Ordered Broadcast):发送出去的广播被广播接收者按照先后顺序接收;先接收的广播接收者可以对广播进行截断,即后接收的广播接收者不再接收到此广播;先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播

二、实现广播

1、静态注册:注册完成就一直运行

2、动态注册:跟随activity的生命周期

三、广播实现机制

Android中的广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型,

因此,Android将广播的发送者 和 接收者 解耦,使得系统方便集成,更易扩展。

模型中有3个角色:

  1. 消息订阅者(广播接收者)
  2. 消息发布者(广播发布者)
  3. 消息中心(AMS,即Activity Manager Service

示意图 & 原理如下:

1、自定义广播接收者BroadcastReceiver,并复写onReceive()方法;

2、通过Binder机制向AMS(Activity Manager Service)进行注册;

3、广播发送者通过Binder机制向AMS发送广播;

4、AMS查找符合条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;

5、消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

四、代码实例

Android四大组件:BroadcastReceiver史上最全面解析

1、继承BroadcastReceiver基类

必须复写抽象方法onReceive()方法

// 继承BroadcastReceivre基类
public class mBroadcastReceiver extends BroadcastReceiver {

  // 复写onReceive()方法
  // 接收到广播后,则自动调用该方法
  @Override
  public void onReceive(Context context, Intent intent) {
   //写入接收广播后的操作
    }
}

2、注册

注册的方式分为两种:静态注册、动态注册

2.1 静态注册

在AndroidManifest.xml里通过<receiver>标签声明

<receiver 
    //此广播接收者类是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

2.2 动态注册

在代码中调用Context.registerReceiver()方法

// 选择在Activity生命周期方法中的onResume()中注册
@Override
  protected void onResume(){
      super.onResume();

    // 1. 实例化BroadcastReceiver子类 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    // 2. 设置接收广播的类型
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    // 3. 动态注册:调用Context的registerReceiver()方法
     registerReceiver(mBroadcastReceiver, intentFilter);
 }


// 注册广播后,要在相应位置记得销毁广播
// 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
// 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
// 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
 @Override
 protected void onPause() {
     super.onPause();
      //销毁在onResume()方法中的广播
     unregisterReceiver(mBroadcastReceiver);
     }
}

特别注意

  • 动态广播最好在Activity 的 onResume()注册、onPause()注销。
  • 原因:
    1. 对于动态广播,有注册就必然得有注销,否则会导致内存泄露

重复注册、重复注销也不允许

五、LocalBroadcastManager详解

特点:

1、使用它发送的广播将只在自身APP内传播,因此你不必担心泄漏隐私数据;

2、其他APP无法对你的APP发送该广播,因为你的APP根本就不可能接收到非自身应用发送的该广播,因此你不必担心有安全漏洞可以利用;

3、比系统的全局广播更加高效。

源码分析 :

1、LocalBroadcastManager高效的原因主要是因为它内部是通过Handler实现的,它的sendBroadcast()方法含义并非和我们平时所用的一样,它的sendBroadcast()方法其实是通过handler发送一个Message实现的;

2、既然它内部是通过Handler来实现广播的发送的,那么相比于系统广播通过Binder实现那肯定是更高效了,同时使用Handler来实现,别的应用无法向我们的应用发送该广播,而我们应用内发送的广播也不会离开我们的应用;

3、LocalBroadcastManager内部协作主要是靠这两个Map集合:MReceivers和MActions,当然还有一个List集合MPendingBroadcasts,这个主要就是存储待接收的广播对象。

六、面试问答

6.1、广播种类

A、普通广播Normal Broadcast:Context.sendBroadcast

B、系统广播System Broadcast:Context.sendOrderedBroadcast

C、本地广播Local Broadcast:只在自身APP内传播

6.2、广播接收者两种注册方式有什么不同

  • 静态注册的广播接收者一经安装就常驻在系统之中,不需要重新启动唤醒接收者;动态注册的广播接收者随着应用的生命周期,由registerReceiver开始监听,由unregisterReceiver撤销监听,如果应用退出后,没有撤销已经注册的接收者应用应用将会报错。
  • 当广播接收者通过intent启动一个activity或者service时,如果intent中无法匹配到相应的组件。动态注册的广播接收者将会导致应用报错,而静态注册的广播接收者将不会有任何报错,因为自从应用安装完成后,广播接收者跟应用已经脱离了关系。
     

 

 

 

 

 

 

 

 

 

 

 


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值