Android的BroadcastReceiver

news2024/11/26 22:18:47

1.基本概念:BroadCast用于进程间或者线程间通信

本质上是用Binder方法,以AMS为订阅中心,完成注册,发布,监听的操作。

2.简单实现的例子

package com.android.car.myapplication;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;



public class MainActivityBroadCast extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_carsetting);

        //系统广播
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        BatteryReceiver batteryReceiver = new BatteryReceiver();
        registerReceiver(batteryReceiver,intentFilter);
    }

    public class BatteryReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            int current = bundle.getInt("level");
            int total = bundle.getInt("scale");

            if(current * 1.0 / total ==1){
                System.out.println("当前手机电量为"+(current / total)*100+"%");
            }
        }
    }
}

用法很简单不多赘述。

3.接收端registerReceiver

ContextImp:Context的最终实现类。class ContextImpl extends Context

  • ContextImpl.registerReceiver方法:
。。。。。。

//注册binder应用和action到系统
final Intent intent = ActivityManager.getService().registerReceiver(
                    mMainThread.getApplicationThread(), mBasePackageName, rd,filter,...);
  • ActivityManager中getService()实际上是一个Binder
    在ActivityManager.java中可看到:
public static IActivityManager getService() {
         return IActivityManagerSingleton.get();
     }
 
     private static final Singleton<IActivityManager> IActivityManagerSingleton =
             new Singleton<IActivityManager>() {
                 @Override
                 protected IActivityManager create() {
                     final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                     final IActivityManager am = IActivityManager.Stub.asInterface(b);
                     return am;
                 }
             };
 }
  • 所以registerReceiver最后是一个向ActivityManagerService的Binder调用,只不过设计上加上了的发布订阅模式

4.发送端 sendBroadcast

  • 首先调用context的sendBroadCast方法
// Context.java

public abstract void sendBroadcast(@RequiresPermission Intent intent);
  • 调到实现类ContextImpl
// ContextImpl.java(extents Context.java)
    @Override
    public void sendBroadcast(Intent intent) {
        warnIfCallingFromSystemProcess();
        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
        try {
            intent.prepareToLeaveProcess(this);
            ActivityManager.getService().broadcastIntent(
                    mMainThread.getApplicationThread(), intent, resolvedType, null,
                    Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, false,
                    getUserId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
  • 同理调用到ActivityManagerService的broadcastIntent方法。

(AMS中关于发布订阅的实现,不在本文范围之内,后续遇到问题再继续研究)

5.总结

如果了解发布订阅的设计模式
了解发布,订阅,订阅中心的模型,那么BroadCastReceiver的基本实现原理就清楚了。

  • 接收端首先订阅,即调用Binder方法registerReceiver。
  • AMS会记下对这个Intent感兴趣的进程
  • 发送端通过Binder方法sendBroadCast发送一个Intent。
  • AMS会收到Intent消息
  • AMS找到所有对Intent消息感兴趣的接收端,将这个消息发到接收端
  • 接收端进入实现的onReceive方法。

参考图:https://www.cnblogs.com/andy-songwei/p/10400259.html
在这里插入图片描述收到

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

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

相关文章

一招解决Mac没有剪切板历史记录的问题

使用Mac的朋友肯定都为Mac的剪切功能苦恼过&#xff0c;旧内容覆盖新内容&#xff0c;导致如果有内容需要重复输入的话&#xff0c;就需要一次一次的重复复制粘贴&#xff0c;非常麻烦 但其实Mac也能够有剪切板历史记录功能&#xff0c;iCopy&#xff0c;让你的Mac也能拥有剪切…

利用泰勒公式近似计算10的平方根

文章目录 1. 泰勒公式是什么2、利用泰勒公式计算 10 \sqrt{10} 10 ​第 1 步&#xff1a;泰勒级数展开第 2 步&#xff1a;计算各阶导数第 3 步&#xff1a;在 x 9 x 9 x9 处计算各阶导数第 4 步&#xff1a;构建各阶泰勒展开式第 5 步&#xff1a;计算 f ( 10 ) f(10) f(1…

python-读写Excel:openpyxl-(4)下拉选项设置

使用openpyxl库的DataValidation对象方法可添加下拉选择列表。 DataValidation参数说明&#xff1a; type&#xff1a; 数据类型("whole", "decimal", "list", "date", "time", "textLength", "custom"…

淘宝商品详情API大揭秘:用Python开启探险之旅

淘宝&#xff0c;一个充满奇迹的丛林 在这个名为淘宝的丛林里&#xff0c;每一件商品都是一座神秘的宝藏。而我们&#xff0c;作为勇敢的探险家&#xff0c;将用Python这把瑞士军刀&#xff0c;去揭开这些宝藏的面纱。准备好了吗&#xff1f;让我们一起踏上这段奇妙的探险之旅…

AJAX 全面教程:从基础到高级

AJAX 全面教程&#xff1a;从基础到高级 目录 什么是 AJAXAJAX 的工作原理AJAX 的主要对象AJAX 的基本用法AJAX 与 JSONAJAX 的高级用法AJAX 的错误处理AJAX 的性能优化AJAX 的安全性AJAX 的应用场景总结与展望 什么是 AJAX AJAX&#xff08;Asynchronous JavaScript and XML…

电路设计中的防接反电路

在现代电子产品设计中,防接反电路是确保设备正常运作、避免损坏的重要措施之一。尤其是在日用电器或工厂生产的电子产品中,常常会涉及电源接反的情况。如果产品设计中没有考虑到这一点,可能会导致电路损坏,甚至对使用者造成安全隐患。因此,如何设计有效的防接反电路,是电…

从零开始学习python 7(持续更新ing)

一、Python函数 1.1 函数的定义 函数的定义&#xff1a;实现【特定功能】的代码块。 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改提高代码的可扩展性 函数的三要素&#xff1a; 功能 len() max() sum()参数 s.clear() s.append(华清远见)返回值 s.sort()…

NUMAP应用成果亮相中国核学会核反应堆热工流体力学分会第四届学术年会

10月28日-30日&#xff0c;中国核学会核反应堆热工流体力学分会第四届&#xff08;2024年&#xff09;学术年会在北京隆重召开。该学术年会是我国反应堆热工流体领域中方向设置最全、规模最大、最具影响力的学术交流盛会。大会共设置3个专题研讨会、8个主题论坛&#xff0c;组织…

Odoo:免费开源的医药流通行业信息化解决方案

文 / 开源智造Odoo亚太金牌服务 方案概述 开源智造Odoo免费开源ERP提供面向医药批发采、供、销业财一体化&#xff0c;及直接面向消费者的门店终端、全渠道管理、营销管理以及GSP合规管理解决方案&#xff0c;提升企业运营效率和全业务链条的数字化管控、追溯能力。 行业的最新…

支付业务以及支付业务的质量保障

前一段时间要在组里分享支付业务&#xff0c;网上找了很多文章&#xff0c;发现有好多也是我自己写的。回头看看3年前的文章&#xff0c;当时对支付有一定的测试经验&#xff0c;但是对支付的了解也不是很深。 经过这近两年的支付相关的测试经验&#xff0c;对支付业务有了更深…

实现视频一键压缩的10款工具大盘点:

在这个信息爆炸的时代&#xff0c;我们们已经习惯了那些高清的4K视频&#xff0c;但是却出现了新的问题。那就是文件过大臃肿。不用担心&#xff0c;你可以使用视频压缩工具来解决这个问题&#xff1b;市场上的视频压缩工具可谓五花八门&#xff0c;不仅具备了智能的算法压缩技…

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs&#xff0c;创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件&#xff08;可选&…

《现代网络技术》读书笔记:SDN数据平面和OpenFlow

本文部分内容来源于《现代网络技术&#xff1a;SDN,NFV,QoE、物联网和云计算&#xff1a;SDN,NFV,QoE,IoT,andcloud》 SDN数据平面 SDN 数据平面也称为基础设施层&#xff0c;而在ITU-T的Y3300标准中则称为资源层&#xff0c;它是网络转发设备根据 SDN控制平面的决策来执行数据…

无线婴儿监视器方案(附SI24R1选型)

随着现代科技的进步&#xff0c;父母们对宝宝的关注和保护达到了前所未有的高度。为了满足这一需求&#xff0c;市场上涌现出了一系列智能婴儿监视器。这些设备不仅能实时监控宝宝的活动&#xff0c;还能让父母在家中的任何角落都能轻松掌握宝宝的动态。今天&#xff0c;我们向…

Sigrity Power SI 3D-EM Full Wave HSSO模式如何进行高速差分过孔结构仿真扫描分析以及反标到Allegro操作指导

Sigrity Power SI 3D-EM Full Wave HSSO模式如何进行高速差分过孔结构仿真扫描分析以及反标到Allegro操作指导 高速差分过孔的优化是仿真分析中比较重要的一个环节,Sigrity Power SI 的3D-EM Full-Wave HSSO模式就是对高速差分过孔结构进行优化一个工具,可以不同的参数进行…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十. 多线程控制帧率。循环播放,QT connect 细节,

在前面&#xff0c;我们总结一下前面的代码。 在 FactoryModeForAVFrameShowSDL 构造函数中 init SDL。 通过 QT timerevent机制&#xff0c;通过startTimer(10);每隔10ms&#xff0c;就会调用timerEvent事件。 在timerEvent事件中&#xff0c;真正的去 读取数据&#xff0c…

WebRTC 环境搭建

主题 本文主要描述webrtc开发过程中所需的环境搭建 环境&#xff1a; 运行环境&#xff1a;ubuntu 20.04 Node.js环境搭建 安装编译 Node.js 所需的依赖包: sudo apt-get update sudo apt-get install -y build-essential libssl-dev 下载 Node.js 源码: curl -sL htt…

libgdiplus在MacOS M1上问题:Unable to load shared library ‘libgdiplus‘

libgdiplus在MacOS M1上问题&#xff1a;Unable to load shared library libgdiplus 问题解决步骤1步骤2 问题 在mac上的pycharm中执行下面的代码时出现下面的错误 slide.get_thumbnail( RuntimeError: Proxy error(TypeInitializationException): The type initializer for…

【VScode】VScode内的ChatGPT插件——CodeMoss全解析与实用教程

在当今快速发展的编程世界中&#xff0c;开发者们面临着越来越多的挑战。如何提高编程效率&#xff0c;如何快速获取解决方案&#xff0c;成为了每位开发者心中的疑问。今天&#xff0c;我们将深入探讨一款颠覆传统编程体验的插件——CodeMoss&#xff0c;它将ChatGPT的强大功能…

关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧

文章目录 1. sizeof 和 strlen1.1 sizeof1.2 strlen 2. 数组和指针结合的试题深入解析2.1 一维数组2.2 字符数组代码1代码2代码3代码4代码5代码6 2.3 二维数组 3.指针运算的试题深入解析题1题2题3题4题5题6题7 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力…