Android笔试面试题AI答之广播(1)
文章目录
- 1.简述广播的分类和使用场景 ?
- 一、广播分类
- 二、使用场景举例
- 总结
- 2.广播的两种注册方式的区别?
- 1. 注册位置与方式
- 2. 生命周期与持久性
- 3. 接收广播的时机
- 4. 安全性与权限
- 5. 优先级与有序广播
- 总结
- 3.简述广播发送和接收的原理 ?
- 一、广播发送原理
- 二、广播接收原理
- 三、总结
- 4.简述本地广播和全局广播的区别 ?
- 1. 广播的可见性
- 2. 注册方式
- 3. 使用场景
1.简述广播的分类和使用场景 ?
Android广播(Broadcast)是一种允许应用之间、应用与系统之间异步通信的机制。在Android中,广播可以分为多个类别,并且每种广播都有其特定的使用场景。以下是Android广播的分类及其使用场景的简述:
一、广播分类
-
标准广播(Normal Broadcast)
- 特点:完全异步的广播,不保证所有接收者会同时接收到广播。即使没有任何接收者,发送者也不会收到任何错误信息。
- 使用场景:适用于一对多的通信场景,如系统启动时发送广播通知各个应用程序进行初始化操作,或网络状态变化时通知各个应用程序更新UI等。
-
有序广播(Ordered Broadcast)
- 特点:同步的广播,保证所有接收者都会按照一定的顺序接收到广播。每个接收者在接收到广播后,可以选择继续传递广播或者中断广播。
- 使用场景:适合需要按照特定顺序处理广播的场景,如权限检查、拦截特定广播等。
-
粘性广播(Sticky Broadcast)
- 特点:可以被持久化的广播,即发送者可以将广播发送给尚未注册的接收者,当这些接收者注册时,它们可以立即接收到最近一次的广播。
- 使用场景:适用于需要在注册前就接收到广播的情况,如监听最近一次的网络状态变化。但请注意,从Android 5.0(API 级别 21)开始,粘性广播已被弃用,建议使用其他机制(如事件总线EventBus)来替代。
-
本地广播(Local Broadcast)
- 特点:只能在应用程序内部传播的广播,不会被系统其他应用程序接收到。
- 使用场景:适合应用程序内部的通信和数据传递,比其他广播更加安全和高效。
-
系统广播(System Broadcast)
- 特点:由系统发送的广播,用于通知应用程序系统事件的发生,如屏幕开关、电量变化、网络状态变化等。
- 使用场景:应用程序可以通过注册系统广播接收器来接收这些广播,以便作出相应的处理。
-
自定义广播(Custom Broadcast)
- 特点:应用程序定义的广播,用于自定义事件的传递和处理。
- 使用场景:实现应用程序内部的各种功能和交互,如Activity与Service之间的通信、Service与Service之间的通信等。
-
其他特殊广播
- App Standby Buckets 广播:从Android 9开始引入,用于帮助应用程序更好地管理其后台运行行为。
- App Ops 广播:Android系统中的一种权限管理机制,用于允许或拒绝应用程序对系统的各种操作。
二、使用场景举例
-
系统级广播使用场景
- 设备启动:监听设备启动的广播,以进行初始化操作。
- 网络状态变化:监听网络状态变化的广播,以更新网络数据或显示相关提示。
- 电量变化:监听电量变化的广播,以显示电量信息或调整应用程序的功耗。
-
自定义广播使用场景
- 应用内部通信:Activity与Service、Service与Service之间的通信。
- 跨应用通信:发送广播通知其他应用程序进行某些操作。
-
特殊场景
- 监听外部设备连接和断开:如蓝牙设备、USB设备等,以便在设备连接或断开时进行相应的操作。
- 监听应用安装和卸载:更新应用列表、清除缓存等。
总结
Android广播机制提供了灵活的应用程序间和系统间的通信方式,通过不同的广播类型和注册方式,可以满足多种使用场景的需求。在使用广播时,应根据具体需求选择合适的广播类型和注册方式,并注意避免滥用广播机制导致性能问题。
2.广播的两种注册方式的区别?
Android广播的两种主要注册方式是静态注册和动态注册。这两种注册方式在多个方面存在明显的区别,以下是对这些区别的详细阐述:
1. 注册位置与方式
- 静态注册:在AndroidManifest.xml文件中进行注册。开发者需要在
<application>
标签内部添加<receiver>
标签,并指定接收器的类名(android:name属性)以及它所关心的动作(通过<intent-filter>
标签内的<action>
标签指定)。 - 动态注册:在代码中,通常是在Activity或Service的onCreate()方法中,通过调用Context的registerReceiver()方法进行注册。开发者需要创建一个IntentFilter对象来指定接收器所关心的动作,并将该对象与BroadcastReceiver实例一起传递给registerReceiver()方法。
2. 生命周期与持久性
- 静态注册:接收器一旦在AndroidManifest.xml中注册,就会随着应用程序的安装而一直存在,即使应用程序没有运行(即进程没有被系统杀死),接收器也能接收到相应的广播。因此,静态注册的接收器具有较强的持久性。
- 动态注册:接收器的生命周期与注册它的Context(如Activity或Service)相关联。当Context被销毁时(如Activity执行onDestroy()方法后),接收器也会被自动注销。因此,动态注册的接收器具有较短的生命周期,且需要开发者手动管理其注册与注销过程。
3. 接收广播的时机
- 静态注册:由于接收器在AndroidManifest.xml中注册,因此它可以接收到系统启动后发出的任何匹配其
<intent-filter>
的广播,包括在系统启动过程中发出的广播。此外,静态注册的接收器还可以接收其他应用程序发出的广播(如果它们具有相应的权限)。 - 动态注册:接收器只能在其所在的Context存活期间接收到广播。如果Context被销毁(如用户退出Activity),则接收器将无法再接收到广播,直到它再次被注册。
4. 安全性与权限
- 静态注册:由于接收器在AndroidManifest.xml中声明,因此它可以被系统或任何其他应用程序直接发送广播到。这可能需要开发者在AndroidManifest.xml中声明相应的权限或使用
<permission>
标签来保护接收器,以防止未授权的访问。 - 动态注册:动态注册的接收器在代码中注册,因此开发者可以更加灵活地控制接收器的安全性和权限。例如,可以在注册接收器时检查发送者的权限,或者只在特定条件下才注册接收器。
5. 优先级与有序广播
- 静态注册:静态注册的接收器可以指定优先级(通过
<intent-filter>
标签的android:priority属性),以控制有序广播(Ordered Broadcast)中接收器的接收顺序。 - 动态注册:动态注册的接收器同样可以指定优先级(通过IntentFilter的setPriority()方法),但需要注意的是,动态注册的接收器在有序广播中的优先级可能受到其他因素的影响,如注册时间等。
总结
静态注册和动态注册各有优缺点,开发者应根据具体需求选择适合的注册方式。静态注册适用于需要长期监听广播且对广播接收时机要求不高的场景;而动态注册则适用于需要灵活控制接收器生命周期和接收条件的场景。同时,开发者还需要注意管理接收器的注册与注销过程,以避免内存泄漏和其他潜在问题。
3.简述广播发送和接收的原理 ?
Android广播发送和接收的原理基于发布-订阅模式,其中广播发送者(发布者)发送广播消息,而广播接收者(订阅者)则接收并处理这些消息。以下是对该原理的详细解释:
一、广播发送原理
-
广播发送者:
- 广播发送者是一个应用程序组件,负责通过Intent对象发送广播。
- 可以通过Context的
sendBroadcast()
方法或sendOrderedBroadcast()
方法发送广播。 - 发送广播时,会定义一个唯一的标识符(action),以便接收者能够过滤并接收这个广播消息。
-
Intent对象:
- 广播消息被封装在Intent对象中,Intent对象不仅包含了广播的action,还可以携带额外的数据(extras)和标志(flags)。
- 这些信息对于接收者来说是必要的,以便它们能够了解广播的具体内容和如何响应。
-
广播队列:
- 当广播发送者发送广播时,Android系统会将广播放入一个名为“广播队列”的队列中。
- 系统会逐个将广播发送给所有匹配的接收者。
二、广播接收原理
-
广播接收者:
- 广播接收者(BroadcastReceiver)是一个应用程序组件,负责接收广播并执行相关操作。
- 它通过在AndroidManifest.xml文件中声明或通过代码动态注册来接收广播。
-
注册方式:
- 静态注册:在AndroidManifest.xml文件中声明BroadcastReceiver,并通过
<intent-filter>
指定所要接收的广播类型。这种方式下,即使应用程序没有运行,也能接收到广播。 - 动态注册:在代码中通过调用Context的
registerReceiver()
方法来注册BroadcastReceiver。这种方式允许应用程序在运行时根据需要注册或注销广播接收器,具有更高的灵活性。
- 静态注册:在AndroidManifest.xml文件中声明BroadcastReceiver,并通过
-
接收广播:
- 当系统发送广播时,会检查所有已注册的BroadcastReceiver,并找出与广播action匹配的接收器。
- 对于匹配的接收器,系统会调用其
onReceive()
方法,并将Intent对象作为参数传递给它。 - 接收者在
onReceive()
方法中处理广播消息,如更新UI、启动服务等。
-
生命周期:
- BroadcastReceiver的生命周期非常短暂,仅在
onReceive()
方法执行时处于活跃状态。 - 当
onReceive()
方法返回后,BroadcastReceiver即为失活状态,并且其所在的进程可能会在系统需要时随时被杀掉。 - 因此,如果处理广播消息需要较长时间,建议将其放入新的线程中执行。
- BroadcastReceiver的生命周期非常短暂,仅在
三、总结
Android广播发送和接收的原理基于发布-订阅模式,通过Intent对象进行消息传递。广播发送者负责发送广播消息,而广播接收者则负责接收并处理这些消息。通过静态注册或动态注册的方式,应用程序可以灵活地接收广播消息,并根据需要进行相应的处理。这种机制使得不同组件之间可以进行松耦合的通信,提高了应用程序的灵活性和可扩展性。
4.简述本地广播和全局广播的区别 ?
本地广播和全局广播是Android系统中两种不同的广播类型,它们在广播的可见性和注册方式上存在显著的区别。以下是它们之间的主要区别:
1. 广播的可见性
- 本地广播:本地广播的发送范围被限制在应用程序内部,即发送的广播事件只能被本应用程序的组件(如Activity、Service等)接收到,其他应用程序无法获取或响应这些广播事件。这种机制增强了应用程序内部通信的安全性,避免了不必要的外部干扰。
- 全局广播:全局广播的发送范围则不受限制,发出的广播可以被任何应用程序接收到,并且这些应用程序也可以发送广播供其他应用程序接收。这种广播方式适用于需要跨应用程序通信的场景,如系统广播(如网络状态变化、电量变化等)和自定义广播(如应用间数据共享等)。
2. 注册方式
- 本地广播:本地广播只能通过动态注册的方式接收,即在代码中通过调用
LocalBroadcastManager
的registerReceiver()
方法注册广播接收器。由于本地广播的发送范围被限制在应用程序内部,因此不需要在AndroidManifest.xml文件中进行静态注册。 - 全局广播:全局广播则既可以通过静态注册(在AndroidManifest.xml文件中声明)也可以通过动态注册(在代码中注册)来接收。静态注册的广播接收器在应用程序启动时由系统自动实例化并注册到系统中,而动态注册的广播接收器则需要在代码中显式地注册和注销。
3. 使用场景
- 本地广播:由于本地广播的可见性和注册方式的限制,它更适合用于应用程序内部的组件间通信,如Activity与Service之间的数据传递、Fragment之间的通信等。使用本地广播可以避免不同应用程序之间的广播冲突和数据泄露问题。
- 全局广播:全局广播则适用于需要跨应用程序通信的场景,如系统广播的接收和处理、不同应用程序之间的数据共享和协作等。然而,由于全局广播的可见性较高,因此在设计和实现时需要特别注意安全性和权限控制问题,以避免恶意应用程序对广播的滥用和干扰。
综上所述,本地广播和全局广播在广播的可见性和注册方式上存在明显的区别,它们各自适用于不同的使用场景。在选择广播类型时,需要根据具体的应用需求和场景来决定使用哪种广播方式。
答案来自文心一言,仅供参考
相关文章:
Android笔试面试题AI答之广播(1)
文章目录 1.简述广播的分类和使用场景 ?一、广播分类二、使用场景举例总结 2.广播的两种注册方式的区别?1. 注册位置与方式2. 生命周期与持久性3. 接收广播的时机4. 安全性与权限5. 优先级与有序广播总结 3.简述广播发送和接收的原理 ?一、广…...

微软商店无法加载,检查你的连接-解决方案
微软商店默认直连国内的服务器。 如果有代理,关闭代理就可以恢复网络了。 但是我就是想用代理,我感觉代理更快, 搜索了很多办法,都没有生效。 然后我在哔哩哔哩的视频下方,看到大家留言,测试了一下&#x…...

数据结构实验报告-树与二叉树
桂 林 理 工 大 学 实 验 报 告 一、实验名称: 实验6 树和二叉树 二、实验内容: 1.编写二叉树的递归遍历算法,实现:给定一棵二叉树的“扩展先序遍历序列”,创建这棵二叉树。 (1)输出二叉树的先序遍历的结点序列。 (2)输出二…...

基于Django+MySQL球馆场地预约系统的设计与实现(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...

8 MQTT
8 MQTT 1、相关概念2、MQTT的操作过程3、MQTT协议3.1 固定报文3.2 连接报文3.3 确认连接请求3.4 构造订阅报文3.5 订阅确认报文3.6 发布报文3.7 其他报文 1、相关概念 MQTT [1] 全名为Message Queuing Telemetry Transport,是一种基于TCP/IP协议上传输的轻量级通信…...

【文件系统】抽象磁盘的存储结构 CHS寻址法 | sector数组 | LAB数组
目录 1.为什么要抽象 2.逻辑抽象_版本1 2.1sector数组 2.2index转化CHS 3.逻辑抽象_版本2 3.1LBA数组 3.2LAB下标转化sector下标 文件其实就是在磁盘中占有几个扇区的问题❗文件是很多个sector的数组下标❗文件是有很多块构成的❗❗文件由很多扇区构成------>文件…...

基于python旅游推荐系统(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...
Mysql大单表JSON优化
优化方案 MySQL 8.0.32 中,有几种方法可以优化存储 JSON 字符串的数据表。以下是一些建议,可以帮助您减少存储空间: 使用压缩: MySQL 8.0 支持表级压缩,可以通过修改表来启用压缩。 ALTER TABLE your_table ROW_FORMATCOMPRESS…...

电脑开机启动项管理小工具,绿色免安装
HiBit Startup Manager 是一款功能强大的启动项管理工具,旨在帮助用户管理和优化计算机的自动启动程序。该软件通过添加或删除应用程序、编辑它们的属性以及管理流程、服务、任务调度程序和上下文菜单来实现这一目标。 HiBit Startup Manager 提供了以下主要功能&a…...

一例AutoHotkey语言生成的文件夹病毒分析
概述 这是一个使用AutoHotkey语言编写的文件夹病毒,使用ftp服务器来当作C2,通过U盘传播,样本很古老,原理也很简单,这种语言的样本还是第一次见到,记录一下。 样本的基本信息 PE32库: AutoIt(3.XX)[-]编译…...

【机器学习第7章——贝叶斯分类器】
机器学习第7章——贝叶斯分类器 7.贝叶斯分类器7.1贝叶斯决策论7.2 朴素贝叶斯分类器条件概率的m估计 7.3 极大似然估计优点基本原理 7.4 贝叶斯网络7.5 半朴素贝叶斯分类器7.6 EM算法7.7 EM算法实现 7.贝叶斯分类器 7.1贝叶斯决策论 一个医疗判断问题 有两个可选的假设&#…...

C++ QT开发 学习笔记(3)
C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…...

【Python实战】如何优雅地实现文字 二维码检测?
前几篇,和大家分享了如何通过 Python 和相关库,自动化处理 PDF 文档,提高办公效率。 【Python实战】自动化处理 PDF 文档,完美实现 WPS 会员功能【Python实战】如何优雅地实现 PDF 去水印?【Python实战】一键生成 PDF…...

行为型设计模式3:模板方法/备忘录/解释器/迭代器
设计模式:模板方法/备忘录/解释器/迭代器 (qq.com)...

思源笔记软件的优缺点分析
在过去一年里,我用了很多款笔记,从word文档到onenote到语雀再到思源,最后坚定的选择了思源笔记 使用感受 首先是用word文档来记笔记,主要是开始时不知道笔记软件怎么好用,等到笔记越来越膨胀的时候我发现,…...

追问试面试系列:Dubbo
欢迎来到Dubbo系列,在面试中被问到Dubbo相关的问题时,大部分都是简历上写了Dubbo,或者面试官想尝试问问你对Dubbo是否了解。 本系列主要是针对面试官通过一个点就使劲儿往下问的情况。 面试官:说说你们项目亮点 好的面试官 我们这个项目的技术亮点在于采用了Spring Cloud…...

动手学深度学习V2每日笔记(卷积层)
本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1L64y1m7Nh/p2&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不…...
qcom ucsi probe
ucsi glink 注册一个ucsi 设备,和pmic glink进行通信,ucsi作为pmic glink的一个client。 lkml的patch https://lkml.org/lkml/2023/1/30/233 dtsi中一般会定义 qcom,ucsi-glink 信息,用于和驱动进行匹配 static const struct of_device_id …...
flask和redis配合
对于涉及数据提交的场景,比如更新用户信息,你可能会使用POST或PUT请求。但是,这些操作通常与直接从Redis缓存中检索数据不同,因为它们可能涉及到对后端数据库或其他存储系统的修改。并且可能需要将更新后的数据同步回Redis缓存&am…...
深度学习中的早停法
早停法(Early Stopping)是一种用于防止模型过拟合的技术,在训练过程中监视验证集(或者测试集)上的损失值。具体设立早停的限制包括两个主要参数: Patience(耐心):这是指验…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...