深入分析 Android BroadcastReceiver (八)

文章目录

    • 深入分析 Android BroadcastReceiver (八)
    • 1. 系统与自定义实现
      • 1.1 系统广播机制
        • 1.1.1 系统广播的实现原理
        • 1.1.2 系统广播的源码分析
      • 1.2 自定义广播机制
        • 1.2.1 自定义广播的实现步骤
        • 1.2.2 自定义广播的源码分析
    • 2. 广播机制设计的初衷与优势
      • 2.1 设计初衷
      • 2.2 优势
    • 3. 总结

深入分析 Android BroadcastReceiver (八)

1. 系统与自定义实现

为了更全面地理解 Android 的广播机制,深入分析其底层实现原理和设计逻辑是非常重要的。这部分内容将探讨广播机制的系统实现以及自定义广播的内部工作机制。

1.1 系统广播机制

系统广播是 Android 操作系统中用于通知应用程序系统事件的重要机制。系统广播通常用于通知系统级别的事件,如网络变化、电量低、屏幕解锁等。

1.1.1 系统广播的实现原理

系统广播的实现主要涉及到 BroadcastReceiverIntentContextActivityManagerService (AMS) 等关键组件。以下是系统广播发送和接收的流程:

  1. 广播发送

应用或系统通过 Context.sendBroadcast() 方法发送广播。

Intent intent = new Intent("com.example.SOME_ACTION");
context.sendBroadcast(intent);
  1. 广播注册

应用通过 Context.registerReceiver() 方法注册广播接收器。

IntentFilter filter = new IntentFilter("com.example.SOME_ACTION");
context.registerReceiver(new MyReceiver(), filter);
  1. AMS 处理广播

广播发送后,ActivityManagerService (AMS) 负责广播的分发。AMS 会查找所有注册了相应广播的接收器,并将广播消息分发给这些接收器。

  1. 接收广播

注册的广播接收器通过 onReceive() 方法接收并处理广播。

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理接收到的广播
    }
}
1.1.2 系统广播的源码分析

Intent.ACTION_BATTERY_LOW 为例,分析系统广播的源码:

  1. 广播发送

在系统检测到电量低时,会通过 BatteryService 发送电量低的广播:

Intent intent = new Intent(Intent.ACTION_BATTERY_LOW);
mContext.sendBroadcast(intent);
  1. AMS 分发广播

ActivityManagerService 接收到广播请求后,通过内部的 BroadcastQueue 进行分发:

void processNextBroadcastLocked(boolean fromMsg) {
    ...
    // 取出下一个广播
    BroadcastRecord r = mBroadcastQueue.dequeueBroadcastLocked(fromMsg);
    ...
    // 分发广播
    deliverToRegisteredReceiverLocked(receiver, info, r);
}
  1. 接收广播

应用注册的接收器接收到广播,并通过 onReceive() 方法处理:

@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BATTERY_LOW.equals(intent.getAction())) {
        // 处理电量低的广播
    }
}

1.2 自定义广播机制

自定义广播是应用程序中用于组件间通信的重要手段,通常用于模块间的数据传递或事件通知。

1.2.1 自定义广播的实现步骤
  1. 定义广播意图

定义一个自定义广播的意图:

Intent intent = new Intent("com.example.CUSTOM_ACTION");
intent.putExtra("data", "Sample data");
context.sendBroadcast(intent);
  1. 注册广播接收器

在应用中注册一个接收器来接收自定义广播:

IntentFilter filter = new IntentFilter("com.example.CUSTOM_ACTION");
context.registerReceiver(new CustomReceiver(), filter);
  1. 接收广播并处理

自定义接收器实现 onReceive() 方法来处理广播:

public class CustomReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("com.example.CUSTOM_ACTION".equals(intent.getAction())) {
            String data = intent.getStringExtra("data");
            // 处理接收到的广播数据
        }
    }
}
1.2.2 自定义广播的源码分析

自定义广播的处理机制与系统广播类似,主要区别在于广播的定义和注册过程由开发者自行控制。

  1. 发送广播

自定义广播的发送通过 Context.sendBroadcast() 方法:

Intent intent = new Intent("com.example.CUSTOM_ACTION");
context.sendBroadcast(intent);
  1. AMS 处理广播

自定义广播也会通过 AMS 进行分发,分发机制与系统广播一致。AMS 会根据注册的接收器列表,将广播消息分发到对应的接收器。

  1. 接收广播

注册的接收器接收并处理广播:

@Override
public void onReceive(Context context, Intent intent) {
    if ("com.example.CUSTOM_ACTION".equals(intent.getAction())) {
        String data = intent.getStringExtra("data");
        // 处理广播数据
    }
}

2. 广播机制设计的初衷与优势

2.1 设计初衷

  1. 解耦组件

广播机制的设计初衷之一是解耦应用程序中的各个组件,使得组件之间的通信更加灵活和松散耦合。通过广播,组件不需要直接引用对方,而是通过广播消息进行通信,从而降低了组件间的依赖性。

  1. 异步通信

广播机制提供了一种异步通信的方式,使得消息的发送和接收可以在不同的线程中进行,不会阻塞主线程,从而提高了应用的响应速度和用户体验。

  1. 系统事件通知

广播机制允许系统向应用程序通知各种系统事件(如网络变化、电池状态等),使得应用程序可以对系统状态的变化做出响应,从而提升了应用的智能化和用户体验。

2.2 优势

  1. 松散耦合

广播机制通过事件驱动的方式进行组件间通信,实现了松散耦合,使得组件之间的依赖关系减少,提升了代码的可维护性和可扩展性。

  1. 灵活性

广播机制支持动态注册和静态注册,提供了极大的灵活性。应用可以根据需要在运行时动态注册广播接收器,也可以通过 Manifest 文件静态注册接收器。

  1. 全局通信

广播机制支持全局范围内的通信,系统广播可以被任何应用接收,自定义广播可以在应用内部进行全局通信,适用于需要全局通知的场景。

3. 总结

广播机制是 Android 中重要的异步通信方式,通过系统广播和自定义广播,实现了应用程序内外部的松散耦合和灵活通信。在实际开发中,开发者应结合具体需求,选择合适的广播机制,并遵循最佳实践,以提升应用的性能和安全性。

  • 系统广播:用于通知应用程序系统级别的事件,通过 AMS 进行广播分发。
  • 自定义广播:用于应用内部组件间的通信,通过自定义意图进行广播发送和接收。
  • 安全与性能优化:通过设置权限、使用 LocalBroadcastManager 以及合理管理广播接收器的生命周期,提升应用的安全性和性能。

通过深入理解广播机制的实现原理和设计逻辑,开发者可以更加高效地利用广播机制进行应用开发,构建高质量的 Android 应用。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂轻量日志收集系统Loki工作原理

Loki 是由 Grafana Labs 开发的日志聚合系统,设计目标是提供一种高效、低成本的日志收集和查询解决方案。与传统的日志系统(如 ELK Stack)不同,Loki 不会对日志内容进行索引,而是仅对日志的元数据进行索引,…

Python数据分析案例49——基于机器学习的垃圾邮件分类系统构建(朴素贝叶斯,支持向量机)

案例背景 trec06c是非常经典的邮件分类的数据,还是难能可贵的中文数据集。 这个数据集从一堆txt压缩包里面提取出来整理为excel文件还真不容不易,肯定要做一下文本分类。 虽然现在文本分类基本都是深度学习了,但是传统的机器学习也能做。本案…

Lunaproxy与711Proxy的对比与优劣分析

今天我们来深入对比两款在市场上备受关注的代理IP服务:Lunaproxy和711Proxy。接下来,我们将从多个角度对这两款服务进行详细分析,帮助大家做出明智的选择。 优势分析 711Proxy的优势 1. 性价比高:711Proxy提供多种灵活的套餐选…

【电商干货分享】干货速看!电商数据集大全!

数据分析——深入探索中小企业数字化转型,专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板,为钻研于数据分析的朋友们加油充电。 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中&#xff0…

C# Application.DoEvents()的作用

文章目录 1、详解 Application.DoEvents()2、示例处理用户事件响应系统事件控制台输出游戏和多媒体应用与操作系统的交互 3、注意事项总结 Application.DoEvents() 是 .NET 框架中的一个方法,它主要用于处理消息队列中的事件。在 Windows 应用程序中,当一…

芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)

文章目录 一、什么是FIFO二、为什么要用FIFO三、什么时候用FIFO四、FIFO分类五、同步FIFO1. 同步FIFO电路框图2. 同步FIFO空满判断3. 同步FIFO设计代码4. 同步FIFO仿真结果 六、异步FIFO1、异步FIFO的电路框图2 、亚稳态3、打两拍4、格雷码5、如何判断异步FIFO的空满&#xff0…

3D Web轻量化平台HOOPS Web Platform的功能与应用分析

随着3D技术在多个行业的广泛应用,对于3D模型轻量化的需求日益增长。HOOPS Web Platform作为一个先进的3D模型轻量化平台,为开发人员提供了一整套工具来构建和部署基于Web的工程应用程序。本文将分析HOOPS Web Platform的核心功能和它在不同领域的应用情况…

VBA初学:零件成本统计之一(任务汇总)

经过前期一年多对金蝶K3生产任务流程和操作的改造和优化,现在总算可以将零件加工各个环节的成本进行归集了。 原本想写存储过程,通过直接SQL报表做到K3中去的,但财务原本就是用EXCEL,可以方便调整和保存,加上还有一部分…

破解在制品管理不透明难题

在快节奏的现代工业浪潮中,每一个细微的管理环节都直接关系到企业的竞争力与盈利能力。在车间生产中,在制品管理流程不透明是一个常见问题,它可能导致生产效率低下、成本增加、库存积压以及沟通障碍等负面影响。 在制品管理流程不透明&#x…

ETAS工具导入Com Arxml修改步骤

文章目录 前言Confgen之前的更改Confgen之后的修改CANCanIfComComMEcuM修改CanNmCanSMDCMCanTp生成RTE过程报错修改DEXT-诊断文件修改Extract问题总结前言 通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml…

8种数据迁移工具

前言 最近有些小伙伴问我,ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业应用来说,我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…

迭代加深——AcWing 170. 加成序列

迭代加深 定义 迭代加深搜索(Iterative Deepening Depth-First Search, IDS)是一种结合了深度优先搜索(DFS)和广度优先搜索(BFS)特点的算法。它通过限制搜索树的深度来控制搜索范围,起初以较小…

CTFShow的RE题(一)

RE2 1.中文字符的显示 2.对文件的读取操作 3.RC4加密 (有一点是魔改的) 4.enflag.txt文件里面的密文是ASCII编码之后的数据(可以放ida中) 也可以放到 010 里(推荐) encDH~mqqvqxB^||zllJq~jkwpmvez{ key for i in enc:keychr…

程序员下班为什么不关电脑?难道在偷偷加班?!

不管是周围的程序员朋友还是网上的很多程序员朋友,在下班后都是习惯不关电脑的,关上显示器,拿上手机,快乐下班! 那么,为什么程序员下班都不关电脑?难道他们在偷偷加班? 其实&#x…

elasticsearch源码分析-04集群状态发布

集群状态发布 cluster模块封装了在集群层面执行的任务,如集群健康、集群级元信息管理、分片分配给节点、节点管理等。集群任务执行之后可能会产生新的集群状态,如果产生新的集群状态主节点会将集群状态广播给其他节点。 集群状态封装在clusterState中&…

基于Qt实现的PDF阅读、编辑工具

记录一下实现pdf工具功能 语言:c、qt IDE:vs2017 环境:win10 一、功能演示: 二、功能介绍: 1.基于saribbon主体界面框架,该框架主要是为了实现类似word导航项 2.加载PDF放大缩小以及预览功能 3.pdf页面跳转…

Qt 网络编程 网络信息获取操作

学习目标:网络信息获取操作 前置环境 运行环境:qt creator 4.12 学习内容 一、Qt 网络编程基础 Qt 直接提供了网络编程模块,包括基于 TCP/IP 的客户端和服务器相关类,如 QTcpSocket/QTcpServer 和 QUdpSocket,以及实现 HTTP、FTP 等协议的高级类,如 QNetworkRe…

SPIN-Diffusion:自我博弈微调提升文本到图像扩散模型性能

扩散模型作为生成AI的关键实体,已经在多个领域展现出了卓越的能力。然而,现有的扩散模型,如Stable Diffusion和SDXL,通常在预训练阶段后需要进行微调以更好地符合人类偏好。最近,研究者们开始尝试使用强化学习&#xf…

矩阵键盘与密码锁

目录 1.矩阵键盘介绍​编辑 2.扫描的概念 3.代码演示(读取矩阵键盘键码) 4.矩阵键盘密码锁 1.矩阵键盘介绍 为了减少I/O口的占用,通常将按键排列成矩阵形式,采用逐行或逐列的 “扫描”,就可以读出任何位置按键的状态…

jenkins配置gitee源码地址连接不上

报错信息如下: 网上找了好多都没说具体原因,最后还是看jenkins控制台输出日志发现: ssh命令执行失败(git环境有问题,可能插件没安装成功等其他问题) 后面发现是jenkins配置git的地方git安装路径错了。新手…