BroadcastReceiver三问—美团真题
时间:2022-07-25
本文章向大家介绍BroadcastReceiver三问—美团真题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说到广播,可能大家都用的比较少了吧,但是作为四大组件的一员,面试中还是少不了此类问题,今天的三问一起来回顾下吧:
- 广播的两种注册方式和生命周期。
- 广播的几种类型以及内部原理。
- BroadcastReceiver 和 EventBus 有啥不同?
广播的两种注册方式和生命周期。
1)注册方式:
- 静态注册,也就是在
Androidmanifest.xml
中注册receiver
标签即可,相关标签含义如下:
<receiver
//能否接收其他 App 发出的广播
android:exported=["true" | "false"]
//继承BroadcastReceiver子类的类名
android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此 BroadcastReceiver 所接收
android:permission="string"
// BroadcastReceiver 运行所处的进程
android:process="string" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
- 动态注册,也就是通过调用Context的
registerReceiver()
进行注册,注意在页面销毁时候调用unregisterReceiver()
进行注销,建议在onResume() 注册,并在onPause()
进行注销。因为onStop等方法可能不会执行。
2)生命周期:
BroadcastReceiver的生命周期很简单,发送事件后,收广播方调用onReceive方法,执行完毕后,对象被销毁,这就是一整个流程。要注意的是onReceive()
方法在10 秒内没有执行完毕, Android 会认为该程序无响应,所以onReceive()
方法不能执行耗时操作。
广播的几种类型以及内部原理。
先说说BroadcastReceiver
的内部原理:大家都知道BroadcastReceiver
是一个系统级的广播,意思是手机里所有的app都能监听和发送,所以BroadcastReceiver
肯定是一个跨进程的通信,所以它的原理其实就是通过Binder机制
形成订阅关系,采用了设计模式中的观察者模式。包括订阅方和发送方以及消息中心,这个消息中心也就是AMS
,进行消息的跨进程处理。
我觉得有四种类型比较重要:
-
无序广播
,也就是默认的广播类型,无序广播对所有的广播接收者而言,是无序的。也就是说,所有接收者无法确定接收时序的顺序,这样也导致了,无序广播无法被停止。当它被发送出去之后,它将通知所有这条广播的接收者,直到没有与之匹配的广播接收者为止。 -
有序广播
,通过 Context.sendOrderedBroadcast() 方法来发送。它可以允许接收者设定优先级,它会按照接收者设定的优先级依次传播。而高优先级的接收者,可以对广播的数据进行处理或者停止掉此条广播的继续传播。广播会先发送给优先级高 (android:priority) 的 Receiver,而且这个 Receiver 有权决定是继续发送到下一个 Receiver 或者是直接终止广播。 -
粘性广播
,它采用 Context.sendStickyBroadcast() 方法进行发送广播。它被发出去之后,会一直滞留在系统中,直到有与之匹配的接收者,才会将其发出去。 -
本地广播
,也就是LocalBroadcastManager类,使用 LocalBroadcastManager.getInstance(Context context) 方法获取到,它会保证广播只在app内进行传播。
BroadcastReceiver 和 EventBus 有啥不同?
我觉得对于应用内的事件传播,EventBus基本可以替代广播了。EventBus
主要有以下优点:
- 调度灵活,可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。
- 使用简单,简直不要太简单,发送一句代码,接受只要方法上写注释即可。
- 快速且轻量
相比之下EventBus的缺点就是不能跨进程,如果要使用跨进程功能的EventBus也有,HermesEventBus
,集成了Hermes和EventBus两个库,内部通信用EventBus,跨进程用的Hermes。所以就有了可以跨进程的HermesEventBus
。项目地址:https://github.com/Xiaofei-it/HermesEventBus
参考链接
https://juejin.im/post/6844903507695239182
- <script>元素在XHTML中的用法
- 有趣的算法(四)——一致性Hash算法模拟redis集群
- ASP.NET5 中静态文件的各种使用方式服务端的静态文件开启目录浏览呈现默认文件使用UseFileServer方法文件类型基于IIS的考虑最佳实践
- 使用ASP.NET Identity以手机短信实现双重验证创建一个ASP.NET 5项目运行应用程序使用SMS短信进行双重验证开启双重验证使用双重验证登陆应用程序禁用账户来防止暴力破解
- ASP.NET 5 之 错误诊断和它的中间件们配置错误处理页面在Development阶段使用错误页面运行时信息页面欢迎页面
- 有趣的算法(五) ——Dijkstra双栈四则运算
- CSS深入理解学习笔记之float
- 轻松初探 Python 篇(五)—dict 和 set 知识汇总
- 全面解析C#中的异步编程为什么要异步过去糟糕的体验一个新的方式Tasks基于任务的异步编程模型Async和await时间处理程序和无返回值的异步方法结束语
- CSS深入理解学习笔记之absolute
- 5个经典的JavaScript面试题
- 轻松初探 Python 篇(四)—list tuple range 知识汇总
- CSS深入理解学习笔记之overflow
- Python爬虫实践——简单爬取我的博客
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法