Android面试题之Broadcast Receiver篇

Broadcast Receiver

=================================================================================

1.如何注册 BroadcastReceiver


在清单文件中注册广播接收者称为静态注册,在代码中注册称为动态注册。

静态注册的广播接收者只要 app 在系统中运行则一直可以接收到广播消息,

动态注册的广播接收者当注册的 Activity 或者 Service 销毁了那么就接收不到广播了。

静态注册:在清单文件中进行如下配置

动态注册:在代码中进行如下注册

receiver = new BroadcastReceiver();

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(CALL_ACTION);

context.registerReceiver(receiver, intentFilter);

2.Android 引入广播机制的用意


  • a.从 MVC 的角度考虑(应用程序内) 其实回答这个问题的时候还可以这样问,android 为什么要有那 四大组件,现在的移动开发模型基本上也是照搬的 web 那一套 MVC 架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的 MVC 架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。

  • b.程序间互通消息(例如在自己的应用程序内监听系统来电)

  • c.效率上(参考 UDP 的广播协议在局域网的方便性)

  • d.设计模式上(反转控制的一种应用,类似监听者模式)


3.两种注册各有什么优缺点


静态注册

  • 常驻,当应用程序关闭后如果有信息广播来,程序也会被系统调用,自己运行。

  • 无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。

动态注册

  • 不常驻,广播会跟随程序的生命周期。

  • 在 Android 的广播机制中,动态注册优先级高于静态注册优先级,因此在必要情况下,是需要动态注册广播接收者的。

  • 当用来注册的 Activity 关掉后,广播也就失效了。


4.广播的类型


  • 普通广播:开发者自定义 intent 广播。

  • 系统广播:系统内置广播,如开机、网络状态变化。

  • 有序广播:发送出去的广播被广播接收者按照先后顺序接收,先接收道广播接受者可对广播进行修改或者截断,使用

sendOrderedBroadcast(intent)。

  • 粘性广播:由于在 Android5.0 & API 21 中已经失效,所以不建议使用,在这里也不作过多的总结。

  • App 应用内广播:App 应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个 App,(将 exported 属性设置为false)


5.BrocastReceiver 里能否进行耗时操作


不能,当 onReceive()方法在 10 s 内没有执行完毕,Android 会认为该程序无响应,所以在BroadcastReceiver 里不能做一些比较耗时的操作,否侧会弹出 ANR 的对话框。


6.描述一下广播 BroadcastReceiver 的理解


BroadCastReceiver 是 Android 四大组件之一,主要用于接收系统或者 app 发送的广播事件。广播分两种:有序广播和无序广播。

内部通信实现机制:通过 Android 系统的 Binder 机制实现通信。

  • 无序广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent 的传播。

  • 有序广播:按照被接收者的优先级顺序,在被接收者中依次传播。比如有三个广播接收者 A,B,C,优先级是 A > B > C。那这个消息先传给A,再传给 B,最后传给 C。每个接收者有权终止广播,比如 B 终止广播,C 就无法接收到。此外 A接收到广播后可以对结果对象进行操作,当广播传给 B 时, B 可以从结果对象中取得 A 存入的数据。

在通过 Context.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)时我们可以指定 resultReceiver 广播接收者。

这个接收者我们可以认为是最终接收者,通常情况下如果比他优先级更高的接收者如果没有终止广播,那么他的 onReceive 会被执行两次,第一次是正常的按照优先级顺序执行,第二次是作为最终接收者接收。如果比他优先级高的接收者终止了广播,那么他依然能接收到广播。

在我们的项目中经常使用广播接收者接收系统通知,比如开机启动、sd 挂载、低电量、外播电话、锁屏等。

如果我们做的是播放器,那么监听到用户锁屏后我们应该将我们的播放之暂停等。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
id开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值