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

目录

一,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.mfbz.cn/a/881409.html

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

相关文章

[产品管理-15]:NPDP新产品开发 - 13 - 产品创新流程 - 具体产品的创新流程:精益生产与敏捷开发

目录 前言&#xff1a;​ 一、集成产品开发IPD模型——集成跨功能团队的产品开发 1.1 概述 1、IPD模型的核心思想 2、IPD模型的主要组成部分 3、IPD模型的实施步骤 4、IPD模型的优点 1.2 基于IPD系统的组织实践等级 1.3 IPD的优缺点 二、瀑布开发模型 1、定义与特点…

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务&#xff0c;2211实际是ssh协议端口&#xff0c;80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…

opencv图像透视处理

引言 在图像处理与计算机视觉领域&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种重要的图像校正技术&#xff0c;它允许我们根据图像中已知的四个点&#xff08;通常是矩形的四个角&#xff09;和目标位置的四个点&#xff0c;将图像从一个视…

软件安装攻略:EmEditor编辑器下载安装与使用

EmEditor是一款在Windows平台上运行的文字编辑程序。EmEditor以运作轻巧、敏捷而又功能强大、丰富著称&#xff0c;得到许多用户的好评。Windows内建的记事本程式由于功能太过单薄&#xff0c;所以有不少用户直接以EmEditor取代&#xff0c;emeditor是一个跨平台的文本编辑器&a…

聊城网站建设:企业如何打造高效官网

聊城网站建设&#xff1a;企业如何打造高效官网 在互联网飞速发展的今天&#xff0c;官方网站已成为企业展示形象、推广产品、与客户沟通的重要平台。尤其对于聊城地区的企业来说&#xff0c;建立一个高效的官网显得尤为重要。本文将分享一些关键步骤&#xff0c;帮助企业打造一…

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

人工智能快速发展下的极端风险管理

文章目录 前言一、快速进步与高风险并存1、深度学习系统缺乏关键功能&#xff0c;其开发周期尚不明朗2、自主人工智能系统一旦导向不良目标&#xff0c;人类可能面临其失控风险 二、技术研发方向调整1、实现安全人工智能的基础性突破&#xff0c;确保人工智能可靠安全2、实现有…

shopro前端 短信登录只显示模板不能正常切换

删掉 换成下面的代码 // 打开授权弹框 export function showAuthModal(type smsLogin) {const modal $store(modal);setTimeout(() > {modal.$patch((state) > {state.auth type;});}, 100); }

Python酷库之旅-第三方库Pandas(123)

目录 一、用法精讲 546、pandas.DataFrame.ffill方法 546-1、语法 546-2、参数 546-3、功能 546-4、返回值 546-5、说明 546-6、用法 546-6-1、数据准备 546-6-2、代码示例 546-6-3、结果输出 547、pandas.DataFrame.fillna方法 547-1、语法 547-2、参数 547-3、…

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实&#xff0c;提供互动性强的学习体验&#xff0c;正在改变传统教育模式。AI不仅改变了传统的教学模式&#xff0c;还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务&#xff0c;AI正在全方位提升教育质量和效率。随着…

【OJ刷题】双指针问题6

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

技术周总结 09.09~09.15周日(C# WinForm WPF 软件架构)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…

Python Selenium 自动化爬虫 + Charles Proxy 抓包

一、场景介绍 我们平常会遇到一些需要根据省、市、区查询信息的网站。 1、省市查询 比如这种&#xff0c;因为全国的省市比较多&#xff0c;手动查询工作量还是不小。 2、接口签名 有时候我们用python直接查询后台接口的话&#xff0c;会发现接口是加签名的。 而签名算法我…

细胞分裂检测系统源码分享

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

计算机人工智能前沿进展-大语言模型方向-2024-09-20

计算机人工智能前沿进展-大语言模型方向-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Garc’ia, Kailan…

[数据集][目标检测]智慧交通铁轨裂缝检测数据集VOC+YOLO格式4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2709 标注数量(xml文件个数)&#xff1a;2709 标注数量(txt文件个数)&#xff1a;2709 标注…

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难&#xff0c;但做到60分基本上照着SOP做到位都没问题&#xff0c;如果我们能把每件事都做到60分&#xff0c;那绝对比至少60%的人都强&#xff0c;除非你的对手不讲武德——那就是他很可能看了我这篇文章&#xff0c;不但每方面都超过及格线&#…

fiddler抓包06_抓取https请求(chrome)

课程大纲 首次安装Fiddler&#xff0c;抓https请求&#xff0c;除打开抓包功能&#xff08;F12&#xff09;还需要&#xff1a; ① Fiddler开启https抓包 ② Fiddler导出证书&#xff1b; ③ 浏览器导入证书。 否则&#xff0c;无法访问https网站&#xff08;如下图&#xff0…

将sqlite3移植到arm开发板上:

一、下载源代码 sqlite3网址&#xff1a;https://www.sqlite.org/download.html 下载&#xff1a;sqlite-autoconf-3460100.tar.gz 二、解压 在Linux家目录下创建一个sqlite3文件夹&#xff0c;将压缩包复制到该文件夹下&#xff0c;再在该目录下打开一个终端&#xff0c;执行…

【Linux】简易日志系统

目录 一、概念 二、可变参数 三、日志系统 一、概念 一个正在运行的程序或系统就像一个哑巴&#xff0c;一旦开始运行我们很难知晓其内部的运行状态。 但有时在程序运行过程中&#xff0c;我们想知道其内部不同时刻的运行结果如何&#xff0c;这时一个日志系统可以有效的帮…