【Android广播机制】之静态注册与动态注册全网详解

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

Hello小伙伴们,今天给大家分享Android的四大组件之广播机制
在本文你将收获以下知识:

文章目录

  • 一、前言
  • 二、广播的概念
  • 三、广播的分类
    • 3.1 标准广播(Normal broadcasts)
    • 3.2 有序广播 (ordered broadcasts)
  • 四、广播注册方式
  • 五、案例
    • 5.1 静态注册广播
    • 5.2 动态注册广播

一、前言

在日常生活中我们经常会听到各式各样的广播消息,比如“铃铃铃,考试结束,考生停止作答”、村里的广播通知等,那么在Android中广播是怎样的呢,我们今天就来探索下。
广播是Android系统四大组件之一,Android应用与Android系统和其他Android应用之间可以相互收发广播消息,比如我们经常遇到的插拔USB数据线、网络变化监听、电量变化监控等。不仅可以接收系统广播,也可以接收自定义广播。

二、广播的概念

在Android中广播分为广播发送者和广播接收者。而BroadcastReceiver指的是广播接收者,所以我们用以下四点来概括什么是广播:

  • 广播是Android四大组件之一,全称为 BroadcastReceiver
  • 广播分为发送方和接收方,就算没有接收方,发送方也会发送数据(这是设计使然)
  • 广播可以实现跨多个页面的数据通信
  • 广播可以实现跨进程间的数据通信。

三、广播的分类

在Android中广播主要分为两种类型:

3.1 标准广播(Normal broadcasts)

是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此他们之间没有任何先后顺序可言。例如系统广播。

在这里插入图片描述

那么随之而来的特点是:

  • 广播的发送者不会知道有哪些接收者接收到了广播消息,也无法影响接收者的执行顺序。
  • 接收者无法中断或取消广播的传递。
  • 广播的发送和接收是完全异步的,发送者和接收者之间没有直接的交互。

Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。常见的系统广播:
在这里插入图片描述

3.2 有序广播 (ordered broadcasts)

是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所有此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
在这里插入图片描述

特点:

  • 有序广播允许接收者按照优先级顺序处理广播消息。接收者可以通过设置优先级来控制自己在广播链中的执行顺序。
  • 每个接收者可以中断广播的传递,以防止其他接收者继续接收广播消息。
  • 有序广播的发送者可以获取接收者处理广播的结果,因为每个接收者可以返回一个结果代码。

有序广播适用的情况

  • 需要按照特定的顺序处理广播消息,确保接收者按照预期的顺序执行。
  • 需要控制广播的传递,允许接收者中断广播的传递。
  • 需要接收者之间进行通信和协作,通过设置结果代码来返回结果给广播发送者。

四、广播注册方式

广播接收器想要接收到消息,必须要进行注册,Android提供了两种注册方式。

  • 静态注册:在AndroidManifest.xml中注册
  • 动态注册:在代码中注册,调用registerReceiver()注册广播。需要注意的是动态注册的接收器一定要取消注册。在onDestroy()方法中调用unregisterReceiver()方法来取消注册。

五、案例

5.1 静态注册广播

1.第一步:创建广播接收器 MyReceiver,继承 BroadcastReceiver 类,并实现 onReceiver()方法,需要注意的是:不要在onReceive()方法中添加过多的逻辑操作或耗时的操作。因为在广播接收器中不允许开启线程,当onReceive()方法运行较长时间而没结束时,程序会报错。因此广播接收器一般用来打开其他组件,比如创建一条状态栏通知或启动一个服务。

public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "静态注册广播来啦", Toast.LENGTH_SHORT).show();}
}

2.第二步:在AndroidManifest.xml 文件标签中注册广播接收器,具体如下

<receiver android:name=".MyReceiver"android:exported="true"android:enabled="true"><intent-filter><action android:name="MY_Receiver"></action></intent-filter></receiver>

其中,
android:name=“.MyReceiver” 用来指定注册哪一个广播接收器
android:enabled表示是否启用这个广播接收器
android:exported 表示是否允许这个广播接收器接收本程序以外的广播
让接收器接收到一条名为"MY_Receiver"的广播

3.第三步:发送广播

Button send_button = findViewById(R.id.button);send_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent("MY_Receiver");intent.setPackage(getPackageName());sendBroadcast(intent);}

快捷方式注册广播接收器。
右击包名——new——other——Broadcast Receiver
在这里插入图片描述
在这里插入图片描述

5.2 动态注册广播

广播动态注册流程:

  1. 新建一个类继承BroadcastReceiver
  2. 实现onReceive方法
  3. 在代码中实例化新建类的广播类
  4. 在代码中实例化IntentFilter
  5. 调用IntentFilter对象的addAction方法设置频道
  6. 在有context环境中调用registerReceiver注册广播
  7. 在有context环境中通过sendBroadcast发送广播
  8. 在有context环境中通过unregisterReceiver
  1. 第一步:先创建一个广播接收器 DynamicBroadcastReceiver.
public class DynamicBroadcastReceiver extends BroadcastReceiver {private static final String TAG = "DynamicBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG,"我是动态注册广播 "+intent.getAction());Toast.makeText(context, "我是动态注册", Toast.LENGTH_SHORT).show();}
}
  1. 第二步:增加一个button,用于发送广播的按钮
 <Button-->android:onClick="DynamicBroadcast"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="动态注册广播"/>
  1. 第三步:注册广播,并发送
package com.example.broadcastdemo;
/*
本示例为动态注册广播Demo*/import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {DynamicBroadcastReceiver dynamicBroadcastReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);regist();}private void regist() {dynamicBroadcastReceiver = new DynamicBroadcastReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("MY_RECEIVER1");registerReceiver(dynamicBroadcastReceiver,intentFilter);}/*动态广播注册*/public void DynamicBroadcast(View view){Intent intent = new Intent("MY_RECEIVER1");sendBroadcast(intent);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(dynamicBroadcastReceiver);}
}

关于上述案例,具体的代码可以参考GitHub:https://github.com/Jenny-Zeng/AndroidLearning/tree/main/BroadcastReceiverDemo/BroadcastDemo,
今天学了很多内容,赶快休息一下吧。

我感到难过,不是因为你欺骗了我,而是因为我再也不能相信你了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch初步了解学习记录

目录 前言 一、ElasticSearch是什么&#xff1f; 二、使用步骤&#xff08;python版&#xff09; 1.引入包 2.连接数据库 3.创建索引 4.写入数据 5.查询数据 三、相关工具介绍 1.ES浏览器插件 总结 前言 随着数据量的不断增加&#xff0c;传统的查询检索在速度上遇…

【C++之queue的应用及模拟实现】

C学习笔记---014 C之queue的应用及模拟实现1、queue的简单介绍2、queue的简单接口应用3、queue的模拟实现3.1、queue的结构一般的构建3.2、queue的适配器模式构建3.3、queue的主要接口函数 4、queue的模拟实现完整代码4.1、一般方式4.2、泛型模式 5、queue巩固练习题5.1、最小栈…

Python——详细解析目标检测xml格式标注转换为txt格式

本文简述了目标检测xml格式标注的内容&#xff0c;以及yolo系列模型所需的txt格式标注的内容。并提供了一个简单的&#xff0c;可以将xml格式标注文件转换为txt格式标注文件的python脚本。 1. xml格式文件内容 <size>标签下为图片信息&#xff0c;包括 <width> …

学习ArkTS -- 常用组件使用

学习ArkTS 使用Deveco studio写ArkTSImage: 图片显示组件1.声明Image组件并设置图片源2. 添加图片属性 Text: 文本显示组件1. 声明Text组件并设置文本内容2. 添加文本属性 TextInput&#xff1a;文本输入框1. 声明TextInput2. 添加属性和事件 Button 组件1. 声明Button组件&…

Testng测试框架(2)-测试用例@Test

测试方法用 Test 进行注释&#xff0c;将类或方法标记为测试的一部分。 Test() public void aFastTest() {System.out.println("Fast test"); }import org.testng.annotations.Test;public class TestExample {Test(description "测试用例1")public void…

Arthas排查工具

简介 | arthas (aliyun.com) 在线安装 #下载jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar#启动会先检测虚拟机进程&#xff0c;如果没有启动失败(idea) java -jar arthas-boot.jar linux安装与window一样 卸载arthas rm -rf ~/.arthas/ rm -rf ~/logs/arthas

Unity TextMeshProUGUI 获取文本尺寸·大小

一般使用ContentSizeFitter组件自动变更大小 API 渲染前 Vector2 GetPreferredValues(string text)Vector2 GetPreferredValues(string text, float width, float height)Vector2 GetPreferredValues(float width, float height) 渲染后 Vector2 GetRenderedValues()Vector…

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…

Rockchip Android13 Vold(一):Native层

一:概述 Vold全称Volume Daemon是用于管理存储类设备的守护进程,负责接收驱动层设备挂载和卸载消息以及与Framework层之间的通信。Vold作为一个守护进程位于Android的Native Daemons层。 二:Vold框架图 三:Vold Sevice Android13的init.rc位于/system/etc/init/hw/其中使…

C语言 | Leetcode C语言题解之第24题两两交换链表中的节点

题目&#xff1a; 题解&#xff1a; struct ListNode* swapPairs(struct ListNode* head) {struct ListNode dummyHead;dummyHead.next head;struct ListNode* temp &dummyHead;while (temp->next ! NULL && temp->next->next ! NULL) {struct ListNod…

【Linux】编写并运行Shell脚本程序操作实例

关于Shell脚本的介绍&#xff1a; Shell脚本是一种用于自动化任务和简化常见操作的脚本语言&#xff0c;通常用于Linux和Unix环境中。Shell脚本允许用户通过编写一系列命令和逻辑语句来执行一系列任务&#xff0c;从而提高了工作效率和自动化水平。 以下是关于Shell脚本的详细…

PlanUML和Mermaid哪个好?

引言 在当今信息化快速发展的时代&#xff0c;数据可视化和图表工具不仅对于程序员&#xff0c;也对于非技术背景的人士至关重要。绘图工具可以帮助我们更好地理解和表达复杂的概念或数据流。PlantUML和Mermaid是两款被广泛使用的绘图语言&#xff0c;它们都能够通过简洁的文本…

测试用例的编写评审

1、什么叫软件测试用例 什么是测试用例 测试用例(TestCase) 是为项目需求而编制的一组测试输入、执行条件 以及预期结果&#xff0c;以便测试某个程序是否满足客户需求。–测试依据 可以总结为:每一个测试点的数据设计和步骤设计。–测试用例 2、测试用例的重要性(了解) 2.1…

航芯通用MCU技术常见问题 | F4专题

日常工作中&#xff0c;我们的销售或技术工程师经常会收到来自用户的问题&#xff0c;其中一些问题是比较常见的&#xff0c;所以为满足日常用户对航芯产品使用及服务的了解&#xff0c;航芯特此推出“通用MCU技术常见问题”专题&#xff0c;分为F0专题及F4专题&#xff0c;欢迎…

Missing artifact org.opencv:opencv:jar:4.10.0 [opencv-4.10.0.jar]

Missing artifact org.opencv:opencv:jar:4.10.0 [opencv-4.10.0.jar] https://mvnrepository.com/artifact/org.opencv/opencv 根本就没有 找了个旧项目的opencv-410.jar修改下opencv-4.10.0.jar放到目录下面就好了 D:\localRepository\org\opencv\opencv\4.10.0 OpenCV-C…

什么是态势感知?

什么是态势感知&#xff1f; 同学&#xff0c;听说过态势感知吗&#xff1f;啥&#xff1f;不知道&#xff1f;不知道很正常&#xff0c;因为态势感知是一个比较小众、比较神秘的概念。为什么态势感知很神秘&#xff0c;首先是因为这是来自军事情报领域的概念&#xff0c;然后…

python--递归算法篇

1、给定一个包含n1个整数的数组nums&#xff0c;其数字在1到n之间&#xff08;包含1和n&#xff09;&#xff0c; 可知至少存在一个重复的整数&#xff0c;假设只有一个重复的整数&#xff0c;请找出这个重复的数 def repeat(ls:list) -> list:#把个数超过1的数&#xff0c…

使用clickhouse-backup备份和恢复数据

作者&#xff1a;俊达 介绍 clickhouse-backup是altinity提供的一个clickhouse数据库备份和恢复的工具&#xff0c;开源项目地址&#xff1a;https://github.com/Altinity/clickhouse-backup 功能上能满足日常数据库备份恢复的需求&#xff1a; 支持单表/全库备份支持备份上…

【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割

left mouse button - set rectangle SHIFTleft mouse button - set GC_FGD pixels CTRLleft mouse button - set GC_BGD pixels 这段代码是一个使用OpenCV库的GrabCut算法进行图像分割的C程序。它允许用户通过交互式方式选择图像中的一个区域&#xff0c;并利用GrabCut算法尝试…

Tomcat无法成功启动——双击startup.bat闪退的解决办法

一、首先查看端口是否被占用了&#xff0c;一般Tomcat的默认端口是8080&#xff0c;可以在管理员命令行通过“netstat -ano|findstr "8080”"的命令查看当前是否有进程占用了端口。 1.如果端口占用了&#xff1a; 则根据PID&#xff08;进程id号&#xff09;来查这个…