深入分析 Android BroadcastReceiver (八)

news2024/11/17 20:42:08

文章目录

    • 深入分析 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.coloradmin.cn/o/1900530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(七)[重制]C++命名空间与标准模板库(STL)

​ 引言 在专栏C教程的第六篇C中的结构体与联合体中,介绍了C中的结构体和联合体,包括它们的定义、初始化、内存布局和对齐,以及作为函数参数和返回值的应用。在专栏C教程的第七篇中,我们将深入了解C中的命名空间(nam…

leetcode判断二分图

判断二分图 图的问题肯定要用到深度优先遍历或者广度优先遍历,但又不是单纯的深度优先遍历算法和广度优先遍历算法,而是需要在遍历的过程中加入与解决题目相关的逻辑。 题干中说了,这个图可能不是连通图,这个提示有什么作用呢&a…

x.java => 字节码文件x.class => 运行

使用javac.exe对.java进行编译,编译成.class字节码文件 使用java.exe启动java虚拟机执行.class字节码 JVM是一个系统进程,这个进程运行会读取.class字节码文件,一旦他抢到了CPU的执行权,就会以那个类的main方法来执行程序逻辑。

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

1119 胖达与盆盆奶

solution 递推&#xff1a;序列的每一位所需要计算的值都可以通过该位左右两侧的结果计算得到&#xff0c;就可以考虑所谓的“左右两侧的结果”是否能通过递推进行预处理来得到&#xff0c;以避免后续使用中的反复求解。 #include<iostream> using namespace std; cons…

Ubuntu 20版本安装Redis教程

第一步 切换到root用户&#xff0c;使用su命令&#xff0c;进行切换。 输入&#xff1a; su - 第二步 使用apt命令来搜索redis的软件包&#xff0c;输入命令&#xff1a;apt search redis 第三步 选择需要的redis版本进行安装&#xff0c;本次选择默认版本&#xff0c;redis5.…

多点mGRE over IPsecVPN 配置及NHRP的使用

一、实验目的及拓扑 1、实验思路&#xff1a;FW1为总部固定IP&#xff0c;FW2和FW3为分支动态地址&#xff0c;通过mGRE over IPsec实现&#xff0c;并加载NHR解决多点隧道目的地址问题 2、网络拓扑 二、基本配置 &#xff08;一&#xff09;配置相关接口地址&#xff0c;并…

项目实战--Spring Boot与PageHelper的集成及线程污染解决

一、PageHelper使用背景 公司要做个简单管理系统&#xff0c;要我搭建Spring BootMyBatisPageHelperRedis的项目框架然后交i给实习生来开发。这个其实很简单&#xff0c;但是遇到搭建和使用过程中PageHelper有好多小坑&#xff0c;就记录一下&#xff0c;避免再踩。 版本选择&…

短视频博主:成都柏煜文化传媒有限公司

短视频博主&#xff1a;数字时代的新星&#xff0c;创意与梦想的舞台 在移动互联网的浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为连接亿万用户、展现生活百态的重要窗口。成都柏煜文化传媒有限公司 而在这片充满无限可能的土地上&#xff0c;短视频博主…

【Python机器学习】处理文本数据——多个单词的词袋(n元分词)

使用词袋表示的主要缺点之一就是完全舍弃了单词顺序。因此“its bad&#xff0c;not good at all”和“its good&#xff0c;not bad at all”这两个字符串的词袋表示完全相同&#xff0c;尽管它们的含义相反。幸运的是&#xff0c;使用词袋表示时有一种获取上下文的方法&#…

Fastjson首字母大小写问题

1、问题 使用Fastjson转json之后发现首字母小写。实体类如下&#xff1a; Data public class DataIdentity {private String BYDBSM;private String SNWRSSJSJ;private Integer CJFS 20; } 测试代码如下&#xff1a; public static void main(String[] args) {DataIdentit…

C# Application.DoEvents()的作用

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

Node.js实现一个文章生成器

前言 本文将从零开始&#xff0c;讲解如何使用Node.js来实现一个文章生成器 node里面有很多优秀的模块&#xff0c;现在我们就借助node的fs模块来操控文本&#xff0c;来实现我们想要的效果 效果展示 体验 fs 首先我们先创建一个json文件 里面放一些内容 接下来我们书写代码…

java花店管理系统eclipse开发mysql数据库

1 绪论 1.1 系统开发目的 随着人们物质生活水平和经济水平的不断提高&#xff0c;室内绿化布置、家庭园艺装饰、礼仪鲜花等日益受到重视和青睐&#xff0c;以及送鲜花给亲朋好友来表达自己的情谊。传统的花店对于信息的管理的主要方式是基于文本、表格等纸质手工处理&#xf…

MATLAB绘图合集包(18种代码和20个绘图)资料免费分享

MATLAB绘图合集包&#xff01;18种代码和20个绘图小技巧&#xff01; 获取链接&#xff1a;https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码&#xff1a;381i 包括单组箱式图、堆叠柱状图、对数坐标图、多组箱式图、二维散点图、进阶热力图、进阶柱状图、面积填充…

ArcGIS Pro:地理信息系统的新篇章

引言 在地理信息系统&#xff08;GIS&#xff09;的世界中&#xff0c;ArcGIS Pro无疑是一款引领潮流的软件。作为一名经验丰富的GIS用户&#xff0c;我对ArcGIS Pro的强大功能和出色性能有着深刻的认识。今天&#xff0c;我想分享一下我对ArcGIS Pro的使用体验&#xff0c;希…

【CG】计算机图形学(Computer Graphics)基础(其壹)

0 学习视频 B站GAMES101-现代计算机图形学入门-闫令琪 1 什么是计算机图形学 1.1 什么是好的画面&#xff1f; 画面足够亮。如果全局光照做的好&#xff0c;整个画面就会亮&#xff0c;看起来很舒服。 1.2 计算机图形学涉及到的领域 数学&#xff08;透视&#xff09;投影…

【AIGC自动化编程技巧笔记】一、起步

本专栏参考了CSDN高级讲师李宁的《AIGC自动化编程技巧》&#xff0c;是学习过程中记录的笔记。 一、ChatGPT的实质 尽管ChatGPT的功能非常强大&#xff0c;看似无所不能&#xff0c;但是ChatGPT毕竟只是基于很多算法和 数据并运行在强大GPU上的大量代码而已。ChatGPT甚至并不…

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

目录 引出定时器事件QTimerEventQTimer 事件的分发事件过滤器 总结QT中的鼠标事件定义QLable的鼠标进入离开事件提升为myLabel重写QLabel的函数鼠标的事件鼠标的左中右键枚举鼠标多事件获取和鼠标移动鼠标追踪 QT中的信号和槽自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.…

【Mindspore进阶】-03.ShuffleNet实战

ShuffleNet图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有…