Broadcast:Android中实现组件及进程间通信

news2024/9/20 16:43:33

目录

一,Broadcast和BroadcastReceiver

1,简介

2,广播使用

二,静态注册和动态注册

三,无序广播和有序广播

1,有序广播的使用

2,有序广播的截断

3,有序广播的信息传递

四,本地广播与全局广播

1,本地广播的使用


一,Broadcast和BroadcastReceiver

1,简介

        broadcast是Android提供的一种广播机制,用于组件或进程(即应用)间通信,同时也是Android四大组件之一;

        广播broadcast由两部分组成:发送者和接收者。发送者可以是Activity,Service等,广播的接收者为BroadcastReceiver,也就是广播接收器;

2,广播使用

broadcast的使用基本分为四步:

  1. 创建BroadcastReceiver类;
  2. 注册BroadcastReceiver;
  3. 发送广播;
  4. 解除注册;

(1)创建BroadcastReceiver子类重写onReceive方法。onReceive方法接收两个参数:context和intent,context为发送者的上下文,intent是发送者发送过来的信息;

public class MyBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "MyBroadcastReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "MyBroadcastReceiver" + " onReceive: 收到了广播消息");
    }
}

(2)注册接收器,接收器的注册方式分为静态注册和动态注册两种方式,这里使用动态注册方式。注册时需要配置过滤器,并且设置action,这里的action表示该注册器能够接收到包含该action的广播;

private void registerTheReceiver() {
    //配置过滤器,设置action
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(TextUtil.ACTION_SEND_RESULT);
    //注册接收器
    registerReceiver(broadcastReceiver, intentFilter);
}

(3)发送广播,与其他四大组件(Activity,Service)相同,也是通过intent来发送广播,通过设置action,标识该广播可被哪些接收器接收到,通过putExtra来传递额外信息;

//设置信息
Intent intent = new Intent();
intent.setAction(TextUtil.ACTION_SEND_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, "这是广播1");
//发送广播
sendBroadcast(intent);

(4)解除注册,应当在合适的地方解除接收器的注册;

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "onDestroy: ");
    //解除注册
    unregisterReceiver(broadcastReceiver);
}

二,静态注册和动态注册

        广播接收器有两种注册方式:在Manifest文件中注册在java代码中注册,我们称在Manifest文件中注册为静态注册,在java代码中注册为动态注册。 上面使用的方式即为动态注册,下面为静态注册方式;

(1)静态注册前同样需要先创建接收器类,然后在Manifest文件中指明接收器的类名,可以通过<intent-filter>标签来配置过滤器,并设置action;

        静态注册的广播一般用于在应用启动时自动接收待定事件,比如系统启动,网络状态变化和电池状态变化等;

常见的广播类型(Action):

三,无序广播和有序广播

无序广播:接收器接收到的广播没有先后顺序,几乎同时收到;

有序广播:接收器按优先级顺序接收广播,同一时刻只能有一个接收器接收到广播;

简单来说就是广播可以设置优先级,然后就可以按顺序接收到广播,设置了优先级的广播称为有序广播,没有设置的称为无序广播,普通广播为无序广播; 

1,有序广播的使用

        通过IntentFilter过滤器的setPriority方法设置优先级,数值范围一般在-1000~1000之间,数值越大,优先级越高,有序广播通过sendOrderedBroadcast方法发送;

注册三个接收器,依次设置优先级,那么接收到的顺序应为3, 2, 1;

private void registerMyReceiver() {
    IntentFilter intentFilter = new IntentFilter(TextUtil.ACTION_SEND_RESULT);
    IntentFilter intentFilter2 = new IntentFilter(TextUtil.ACTION_SEND_RESULT);
    IntentFilter intentFilter3 = new IntentFilter(TextUtil.ACTION_SEND_RESULT);

    //设置优先级
    intentFilter.setPriority(100);
    intentFilter2.setPriority(101);
    intentFilter3.setPriority(102);

    registerReceiver(myBroadcastReceiver, intentFilter);
    registerReceiver(myBroadcastReceiver2, intentFilter2);
    registerReceiver(myBroadcastReceiver3, intentFilter3);
}
Intent intent = new Intent();
intent.setAction(TextUtil.ACTION_SEND_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, "这是广播2");
//有序广播的发送
sendOrderedBroadcast(intent, null);

运行结果如下,可以看到接收顺序确实为3, 2, 1;

2,有序广播的截断

        在接收器中调用abortBroadcast方法即可阻断有序广播的传递 ,截断后广播不在向下传递,类似于Android的事件分发;

        以上面的例子为基础,我们在接收器2中截断广播,那么预期结果应为接收器3, 2可以接收到广播,1接收不到;

public class MyBroadcastReceiver2 extends BroadcastReceiver {
    private static final String TAG = "MyBroadcastReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "MyBroadcastReceiver2" + " onReceive: 收到广播消息");
        abortBroadcast(); //有序广播的截断
    }
}

运行结果如下,可以看到接收器1没有接收到广播:

3,有序广播的信息传递

        在有序广播的传递过程中,可以通过一系列方法来传递一些信息,上游接收器通过这些方法来向下游传递额外信息:

//传递Bundle信息

setResultExtras(Bundle);

//传递字符串信息
setResultData(String);

//传递int型信息
setResultCode(int);

//同时传递int, String, Bundle型数据
setResult(int, String, Bundle);

下游接收器通过对应的get方法来获取信息:

//获取Bundle信息
getResultExtras(true);//true表示如果传递过来的数据为空,则返回一个空的Map

//获取int型信息
getResultCode();

//获取String型信息
getResultData();

         例如我们在接收器3中向下游传递一些信息,因为接收器2的优先级小于接收器3,所以可以在接收器2中接收到传递的信息:

public class MyBroadcastReceiver3 extends BroadcastReceiver {
    private static final String TAG = "MyBroadcastReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        //向下游传递额外信息
        Bundle bundle = intent.getExtras();
        bundle.putString("name", "MyBroadcastReceiver3" + " 喜多郁代");
        setResultExtras(bundle);
        Log.i(TAG, "MyBroadcastReceiver3" + " onReceive: 收到静态广播消息");
    }
}
public class MyBroadcastReceiver2 extends BroadcastReceiver {
    private static final String TAG = "MyBroadcastReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = getResultExtras(true);//true表示如果传递过来的数据为空,则返回一个空的Map
        String name = bundle.getString("name");
        Log.i(TAG, "发件人: " + name + " " + "收件人: " + "MyBroadcastReceiver2");
        Log.i(TAG, "MyBroadcastReceiver2" + " onReceive: 收到静态广播消息");
    }
}

运行结果如下: 

四,本地广播与全局广播

本地广播:仅在本app内部传播,其他app接收不到,保证了数据的安全性;

全局广播:可以在整个手机所有app之间传播,会有安全性问题,普通广播默认是全局广播;

本地广播的注册,发送和解除注册都需要通过LocalBroadcastManager类来完成,使用LocalBroadcastManager需要添加依赖:

implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'

 另外,本地广播只能使用动态注册的方式,因为静态注册一般用于在应用启动时自动接收待定事件,而这些广播一定是全局广播;

1,本地广播的使用

(1)创建接收器,还是常规操作:

public class MyLocalBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "MyLocalBroadcastReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "onReceive: 收到了本地广播");
    }
}

(2)通过LocalBroadcastManager类注册接收器:

//获取localBroadcastManager类
localBroadcastManager = LocalBroadcastManager.getInstance(this);

IntentFilter intentFilter1 = new IntentFilter(TextUtil.ACTION_SEND_LOACL_RESULT);

localBroadcastManager.registerReceiver(myLocalBroadcastReceiver, intentFilter1);

(3)发送广播:

Intent intent = new Intent();
intent.setAction(TextUtil.ACTION_SEND_LOACL_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, "这是本地广播");
//发送本地广播
localBroadcastManager.sendBroadcast(intent);

(4)解除注册:

@Override
protected void onDestroy() {
    super.onDestroy();
    localBroadcastManager.unregisterReceiver(myLocalBroadcastReceiver);
}

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

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

相关文章

AI产品经理面试100问,三天看完一周拿4个offer

AI产品经理面试100问 Attention(重点掌握) 1.什么是 Attention?为什么要用 Attention?它有什么作用? 2.Attention的流程是什么样的? 3.普通的Attention和Transformer的Self-attention之间有什么关系? 4.什么是Self-attention? Transformer(重点掌握) 1.Transformer是什…

[Linux]:信号(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 信号的引入 1.1 信号的概念 在Linux系统中&#xff0c;信号&#xff08;…

在泰国旅游不会口语怎么办?求推荐翻译软件!!!

如果在泰国旅游时遇到语言障碍&#xff0c;可以采取以下措施&#xff1a;学习一些基础的泰语短语&#xff0c;使用翻译应用程序&#xff0c;携带翻译卡片&#xff0c;利用身体语言&#xff0c;参加有导游的旅行团&#xff0c;选择提供中文服务的酒店和旅行社&#xff0c;使用地…

【leetcode】字典 哈希表习题

1.两数之和&#xff08;查找表法-哈希表&#xff09; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次…

【人工智能学习笔记】7_智能语音技术基础

智能语音技术概述 智能语音技术通过对语音进行分析、理解和合成,是计算机设备实现“能听会说”、具备自然语音交流的技术能力。其涉及的范围主要有: 语音合成技术语音识别技术语音测评技术语音降噪与增强技术…智能语音技术的研究内容 智能语音技术的研究难点 智能语音技术…

旅行社区应该如何规划?

近年来&#xff0c;旅游行业逐渐恢复&#xff0c;包括微度假、精致露营、康养旅游、乡村民宿等旅游模式。用户旅游支出、旅游人次逐渐恢复&#xff0c;旅游收入仍待提升。 那么旅游社区应该如何搭建&#xff0c;内容如何规划呢&#xff1f; 我们了解到&#xff0c;很多旅游网…

哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 在使用ArcGIS Pro的过程中&#xff0c;很多朋友发现&#xff0c;Pro有个成对叠加工具集。很多…

PSG3D V2024 注册机 蓝天大数据三维测绘系统

PSG3D2024三维测绘系统是基于 AutoCAD 平台开发的&#xff0c;以“智能、 专业、高效、易学”为设计目标开发的全新一代地理数据采集、编辑 和联动的专业软件。 系统集成了三维测图、坐标转换、地形处理、数字地模、无人机 辅助、不动产调查、土地确权、部件普查和数据转换等专…

数字产业中心:技术赋能产业,如何重塑行业格局!

在数字化浪潮的推动下&#xff0c;数字产业中心正逐步成为推动经济转型升级的重要引擎。这里&#xff0c;技术不仅仅是工具&#xff0c;更是重塑行业格局、引领未来发展的核心力量。 一、技术融合创新&#xff0c;打破传统边界 数字产业中心通过云计算、大数据、人工智能等前沿…

【Python】练习:控制语句(二)第1关

第1关&#xff1a;分支结构基础实训 第一题第二题第三题第四题&#xff08;※&#xff09;第五题&#xff08;※&#xff09;第六题第七题 第一题 #第一题 for temp in [-280, -100, 0, 20, 120, 200]:#请在下面编写代码# ********** Begin ********** #if temp>-273.15:F9/…

【Git 操作】Git 的基本操作

文章目录 1. Git 的配置2. 工作区、暂存区、版本库 1. Git 的配置 &#x1f427;①首先要新建一个目录&#xff0c;该目录用于放项目代码&#xff0c;在该目录下执行git init命令&#xff0c;用于创建一个 Git的本地仓库。 .git ⽬录是 Git 来跟踪管理仓库的。&#x1f427;②…

原生+jquery写自动消失的提示框

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>自动消失消息提示</title> <style>/…

linux内核 devtmpfs介绍

文章目录 概要整体架构流程技术细节 概要 提示&#xff1a;这里可以添加技术概要 linux内核中 devtmpfs实现介绍 内核版本&#xff1a;5.10 Devtmpfs在Linux中是一个特殊的设备文件系统&#xff0c;主要用来linux内核中加速启动过程和管理设备节点。高版本的linux基本都是使用…

25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的二手电子设备交…

【渗透测试】——VulnHub靶机渗透实战 | HA:Joker

&#x1f4d6; 前言&#xff1a;Vulnhub 是一个漏洞靶场平台&#xff0c;里面含有大量的靶场镜像&#xff0c;只需要下载虚拟机镜像&#xff0c;导入 VMWare 或者 VirtualBox 即可启动靶场。本文将从环境搭建、端口扫描、目录扫描到信息提取和突破8080端口&#xff0c;尽可能排…

Cesium Shader 广告牌纹理动画

Cesium Shader 广告牌纹理动画 Cesium 在广告牌, 自定义shader实现播放spritesheet. 图片资源: https://www.codeandweb.com/free-sprite-sheet-packer Cesium Shader 广告牌纹理动画

MySQL高阶1843-可疑银行账户

目录 题目 准备数据 ​分析数据 实现 总结 题目 如果一个账户在 连续两个及以上 月份的 总收入 超过最大收入&#xff08;max_income&#xff09;&#xff0c;那么认为这个账户 可疑。 账户当月 总收入 是当月存入资金总数&#xff08;即 transactions 表中 type 字段的…

Vivado FIR IP 详解 (一)

FIR滤波器是数字信号处理中常用的滤波器&#xff0c;除了通过Verilog代码自己实现外&#xff0c;Vivado提供了一个FIR滤波器 IP&#xff0c;可以直接调用。 一、什么是 Vivado FIR IP 核 FIR&#xff08;Finite Impulse Response&#xff09;滤波器即有限长单位冲激响应滤波器…

兔子检测系统源码分享

兔子检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

安卓13设置动态显示隐藏第一页的某一项 动态显示隐藏无障碍 android13设置动态显示隐藏第一页的某一项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有时候,我们的设置里面显示的信息,需要根据不同的情况显示不同的信息,例如,动态的显示或者隐藏 “无障碍” 这一项。 2.问题分析 像这个问题…