【Android】Broadcast广播的使用

news2024/11/18 5:55:14

一、广播机制概述

通常情况下在学校的每个教室都会装有一个喇叭,这些喇叭是接入到学校广播室的。如果有重要通知,会发送一条广播来告知全校师生。为了便于发送和接收系统级别的消息通知,Android系统也引入了一套类似广播的消息机制。

Android中的广播(Broadcast)机制用于进程/线程间通信,该机制使用了观察者模式,观察者模式是一种软件设计模式,该模式是基于消息的发布/订阅事件模型,该模型中的消息发布者是广播机制中的广播发送者,消息订阅者是广播机制中的广播接收者。

在这里插入图片描述

上述图中的广播机制的实现流程具体如下:
1、广播接收者是通过Binder机制在AMS(Activity Manager Service)中进行注册的
(在8.2小节会讲解广播接收者的注册)。
2、广播发送者是通过Binder机制向AMS发送广播。
3、AMS查找符合相应条件(IntentFilter/Permission)的广播接收者
(BroadcastReceiver),将广播发送到相应的消息循环队列中。
4、执行消息循环时获取到此广播,会回调广播接收者(BroadcastReceiver)中的
onReceive()方法并在该方法中进行相关处理。

二、广播接收者

Android系统中内置了很多广播,例如手机开机完成、电池电量不足时都会发送一条广播。
为了监听来自系统或者应用程序的广播事件,Android系统提供了BroadcastReceiver(广播接收者)组件。
当Android系统产生一个广播事件时,可以有多个对应的广播接收者接收并进行处理。

1、广播接收者的创建

1、通过在应用程序的包中创建一个类继承BroadcastReceiver并重写onReceive()方法来实现
2、通过选中应用程序中的包,右击选择【New】→【Other】→【Broadcast Receiver】选项来创建

public class MyBroadcast extends BroadcastReceiver {
    @Override
    // 当广播接收者接收广播成功,此方法会自动回调执行,在该方法中实现广播接收者的相关操作
    public void onReceive(Context context, Intent intent) {

    }
}

注意:创建完广播接收者之后还需要对广播接收者进行注册才可以接收广播。

2、广播接收者的注册

(1)静态注册
AndroidManifest.xml清单文件中

<receiver
   android:name=".utils.MyBroadcast"
   android:enabled="true"
   android:exported="true">
   <intent-filter>
   	<action>cn.com.hello</action> 
   </intent-filter>
</receiver>

注意:静态注册广播,在小于Android8.0的设备上,只要设备处于开启状态,广播接收者就能接收到广播。Android8.0之后不支持静态注册方式。

(1)动态注册

<receiver
   android:name=".utils.MyBroadcast"
   android:enabled="true"
   android:exported="true">
</receiver>
public class BroadcastReceiverActivity extends AppCompatActivity {
    private MyBroadcast myBroadcast;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_receiver);
        // 创建广播接收者对象
        myBroadcast = new MyBroadcast();
        String action = "cn.com.hello"
        // 创建意图过滤器
        IntentFilter intentFilter = new IntentFilter();
        // 设置要过滤的广播
        intentFilter.addAction(action );
        // 注册广播接收者
        registerReceiver(myBroadcast,intentFilter);
    }

    // 广播接收者是稀缺资源,使用结束要注销,可以在app销毁的阶段进行注销
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myBroadcast);
    }
}

注意:动态注册的广播接收者是否被注销依赖于注册广播的组件,当组件销毁时,广播接收者也随之被注销。

三、广播的类型

1、无序广播

无序广播是完全异步执行,发送广播时所有监听这个广播的广播接收者都会接收到此消息,但接收的顺序不确定。

发送广播:

btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
      // 发送一次广播
      Intent intent = new Intent();
      intent.putExtra("info","hello,who are you ?");
      // 设置广播的action,相当于广播的名称
      String action = "cn.com.hello"
      intent.setAction(action);
      // 发送广播,广播会发送到信息中心,由信息中心负责找到这个广播的订阅者并将广播的意图传过去
      // 无序广播
		 sendBroadcast(intent);
  }
});

接收广播:
(1)MyBroadcast工具类文件:

public class MyBroadcast extends BroadcastReceiver {
    @Override
    // 当广播接收者接收广播成功,此方法会自动回调执行
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("info");
			 Log.v("msg","接收到了广播信息!");
    }
}

(2)Activity文件

myBroadcast = new MyBroadcast();
String action = "cn.com.hello"
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action); 
registerReceiver(myBroadcast,intentFilter);

2、有序广播

按照接收者的优先级接收,只有一个广播接收者能接收消息,在此广播接收者中逻辑执行完毕后,才会继续传递。

发送广播:

Intent intent = new Intent();
intent.putExtra("info","hello,who are you ?");
String action = "cn.com.hello"
intent.setAction(action);
// 有序广播
sendOrderedBroadcast(intent,null);

接收广播:
(1)MyBroadcast工具类文件:

public class MyBroadcast extends BroadcastReceiver {
    @Override
    // 当广播接收者接收广播成功,此方法会自动回调执行
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("info");
			 Log.v("msg","接收到了广播信息!");
			 // 截断广播的发送,之后的广播接收者就接收不到广播了
        abortBroadcast();
    }
}

(2)Activity文件

myBroadcast = new MyBroadcast();
String action = "cn.com.hello"
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action); 
// 设置优先级
intentFilter.setPriority(8);
// 注册广播接收者
registerReceiver(myBroadcast,intentFilter);

注意:数值越大,优先级越高。如果两个广播接收者的优先级相同,则先注册的广播接收者优先级高。

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

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

相关文章

股票撤单委托接口是如何操作的?

在交易的过程中&#xff0c;要先通过股票撤单委托接口获取委托单列表的数据&#xff0c;才可以进行撤单的操作&#xff0c;部分的数据会作为参数传递给撤单函数&#xff0c;下面来具体看看股票撤单委托接口是如何操作的&#xff1f; std::cout << " 撤单委托 \n&qu…

025_SSS_BeLFusion: Latent Diffusion for Behavior-Driven Human Motion Prediction

BeLFusion: Latent Diffusion for Behavior-Driven Human Motion Prediction 本文关注的问题是human motion prediction&#xff08;HMP&#xff09;&#xff0c;也就是在给定观测到的人体运动的前提下&#xff0c;预测人体的后续运动。本文的思路是&#xff0c;将人的behavio…

Linux文件服务NFS共享存储服务

作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。创作不易&#xff0c;动动小手…

高视医疗在港交所上市:IPO首日跌破发行价,高铁塔为控股股东

12月12日&#xff0c;高视医疗&#xff08;HK:02407&#xff09;在港交所上市。本次上市&#xff0c;高视医疗的发行价确定为每股发售股份51.40港元。据此计算&#xff0c;高视医疗预计募资约6.72亿港元。而招股书则显示&#xff0c;该公司预计募资净额约为2.83亿港元&#xff…

java 剑指 Offer 57 - II. 和为s的连续正数序列

题目所属分类 双指针的做法 O&#xff08;n)的时间复杂度 同时末尾有List<int[]> res 这种的转化成二位数组 原题链接 输入一个正整数 target &#xff0c;输出所有和为 target 的连续正整数序列&#xff08;至少含有两个数&#xff09;。 序列内的数字由小到大排列&…

Spring Boot自定义starters

一、简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter&#xff08;场景 启动器&#xff09;&#xff0c;我们通过引入springboot 为我提供的这些场景启动器&#xff0c;我们再进行 少量的配置就能使用相应的功能。即使是这样&#xff0c;springboot也不…

R语言绘制复杂抽样设计数据cox回归生存曲线(Kaplan-Meier)

上期咱们已经介绍了咱们绘制复杂抽样设计数据的基础图形&#xff0c;今天咱们来介绍一下咱们绘制复杂抽样设计cox回归生存曲线(Kaplan-Meier)。 废话不多说咱们先导入数据和R包 library(survey) pbc<-read.csv("E:/r/test/pbc.csv",sep,,headerTRUE) 这是一个原…

web前端-javascript-prototype原型(说明,访问,优势,判断是否含有一个属性,原型对象的原型)

prototype 原型 1. 原型介绍 function Person() {} function MyClass() {}//向MyClass中添加属性a MyClass.prototype.a 123;//向MyClass的原型中添加一个方法 MyClass.prototype.sayHello function () {alert("hello"); };var mc new MyClass(); var mc2 new …

使用VUE自定义组件封装数据字典实战

背景 照惯例&#xff0c;先交待下背景&#xff0c;从真实需求出发&#xff0c;讲述设计思路和实现方式。 软件系统中&#xff0c;会有一些成组的常量值&#xff0c;来描述业务实体的属性&#xff0c;如性别、证件类型、审批状态等。我们通常称之为数据字典&#xff0c;作为系统…

Seata

Seata的三大角色 TC&#xff08;Transaction Coordinator&#xff09;-事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM&#xff08;Transaction Manager&#xff09;-事务管理器 定义全局事务的范围&#xff1a;开始全局事务、提交或回滚全局…

图片怎么编辑里面的文字?这篇文章告诉你方法

大家平时在分享自己拍摄的照片时&#xff0c;会不会觉得照片有点单调&#xff0c;留白面积大呢&#xff1f;其实这时候&#xff0c;我们可以给图片添加一些文字描述&#xff0c;就能够丰富图片的内容&#xff0c;并且我们也可以将这些加文字的图片当做表情包来使用。那么你们知…

【人工智能】【总结】CMSC5707 Advanced Topics in Artificial Intelligence

文章目录1. 音频信号处理介绍2. 音频信号预处理3. 特征4. 特征重现5. 语音识别6. AdaBoost7. 人脸识别8. 神经网络9. 卷积神经网络10. Auto-Encoder11. 循环神经网络 和 LSTM12. Word Representation13. 决策树1. 音频信号处理介绍 x KHz, y bit, n s 多少 byte: x∗1000∗y/8…

【12月9日更新1/4决赛预测】用二元泊松模型预测2022年世界杯淘汰赛结果

用二元泊松模型预测2022年世界杯淘汰赛结果 网上有很多文章用双泊松&#xff08;Double Poisson&#xff09;模型来预测世界杯比赛结果。但是双泊松模型有一个严重的缺陷&#xff0c;那就是它假设比赛中两队的比分是条件独立的。而我们都知道&#xff0c;在对抗性比赛中&…

【PCB设计】孔间距不可忽视,小心废板!

为什么有时候明明PCB设计没有检查出错误&#xff0c;但是在生产加工后还是出现短路、断板等不良情况&#xff1f; 那是因为你没有考虑到孔间距问题&#xff0c;导致在装配过程中无法避免的产生损耗。 PCB单面板或双面板的制作&#xff0c;都是在下料之后&#xff0c;直接进行非…

商品信息管理系统(Python)完整版

目录 功能模块&#xff1a; 实现思路&#xff1a; 运行功能演示&#xff1a; 具体实现过程&#xff1a; 定义商品类&#xff1a; 定义商品管理类 定义显示商品信息函数 输入销量函数&#xff1a; 添加商品信息&#xff1a; 删除商品信息 修改商品信息 导入商品信息…

Linux下安装Zookeeper教程

ZooKeeper 简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服…

字符串匹配算法(BFRK)

文章目录题目一、BF算法二、RK算法补充题目 有字符串 str1 和 str2 &#xff0c;str1 中是否包含 str2&#xff0c;如果没有包含返回 -1&#xff0c;如果包含&#xff0c;则返回 str2 在 str1 中开始的位置 注&#xff1a;保证 str1 和 str2 字符串的长度大于 0 举例&#x…

k8s-kubeadm安装1.25.5

准备环境&#xff1a; 想体验下新的版本 主机名IP资源k8s-master192.168.1.1912u2G内存20G磁盘k8s-node192.168.1.1922u2G内存20G磁盘 1 修改主机名&#xff0c;配置hosts文件 # 修改主机名 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node # 修改h…

CMMI2.0配置管理工作及访谈学习笔记(续)

1. 配置管理岗位职责 范围&#xff1a;组织级和项目级配置管理管理对象为过程和产品&#xff0c;产品为识别出的配置项建立配置库&#xff1a;为项目建立开发库&#xff08;管理库&#xff09;、基线库&#xff0c;建立配置库结构并分配权限&#xff08;命名规范&#xff09;基…

猿如意中的【DBeaver】工具详情介绍

猿如意中的【DBeaver】工具详情介绍一、工具名称二、下载安装渠道2.1 什么是猿如意&#xff1f;2.2 如何下载猿如意&#xff1f;2.3 如何在猿如意中下载开发工具&#xff1f;三、工具介绍四、DBeaver功能介绍五、软件截图六、DBeaver安装过程6.1 在猿如意中下载DBeaver6.2 选择…