广播机制-广播接收者BroadcastReceiver

news2024/9/25 21:18:22

在Android中,广播是一种在组件之间传递消息的机制,例如电池电量低时会发送一条提示如果要接收并过滤广播中的消息,则需要使用Broadcast Receiver(广播接收者)。
广播接收者是Android四大组件之一,通过广播接收者可以监听系统中的广播消息,实现在不同组件之间的通信。常用于不同App间通信。

一、广播接收者BroadcastReceiver

在现实生活中,很多人会收听广播,例如出租车司机会收听实时路况广播,关注路面拥堵情同样Android中也内置了很多广播,例如手机开机完成后会发送一条广播,电池电量不足时也会发送一条广播等。为了监听这些广播事件,Android提供了一个广播接收者组件,该组件可以监听来自系统或者应用程序的广播。

当Android产生一个广播事件时,可以有多个对应的广播接收者接收并进行处理,这些广播接收者只需要在清单文件或者代码中进行注册并指定要按收的广播事件,然后创建一个继承BroadcastReceiver的类,在该类中重写onReceive()方法,并在onReceiver()方法中对广播事件进行处理。 

1.创建广播接收者 

(1)第一种创建方式

在AndroidStudio中创建一个继承BroadcastReceiver的MyBroadcastReceiver类,并重写onReceiver()方法。

//例
public class MyBroadcastReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");

    }

}

(2)第二种创建方式

选中应用程序的包,单击鼠标右键并选择[NEW]→[Other]→[Broadcast Receiver]选项,会弹出一个Configure Component页面。
页面中[ClassName]表示要创建的广播接收者的名称,[Exported]表示是否接收当前程序之外的广播[Enable]表示广播接收者是否可以由系统实例化;[SauceLanguage]表示编写源码所用的语言。[Exported]和[Enable]默认是勾选的,[SouceLanguage]的选项中有[Java]和[Kotlin],选择默认的[Java]选项即可。单击"Finish"锡钮,广播接收者便创建完成。

//例
public class MyBroadcastReceiver extends BroadcastReceiver {
    public MyBroadcastReceiver(){

    }
    public void onReceive(Context context, Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");

    }
}

在上述代码中,创建的广播技收者MyReceiver默认重写构造,函数MyReceiver()与onReceiver()方法。其中,onReceive()方法用于接收发送的广播消息,实现广播接收者的相关操作,该方法在此处暂未实现,程序默认抛出了一个未支持操作异常UnsuportedOperationErception,在后续程宇实现onReceive()方法时,删除该异常即可。

2.注册广播接收者

广播接收者的注册方式有两种,分别是动态注册静态注册动态注册是在Activity中通过代码注册广播接收者静态注册是在清单文件中通过配置广播接收者完成注册。需要注意的是,在Android8.0版本之后的系统中,通过静态注册方式注册的广播接收者已经接收不到广播了必须通过动态注册才可以接收广播

(1)动态注册

在MainActivity中动态注册广播接收者MyBroadcastReceiver的具体代码如下:

registerReceiver( receiver , intentFilter )方法用于注册广播接收者,两个参数分别为光比接收者对象及意图过滤器(用于接收指定的广播)。

unregisterReceiver( receiver )方法用于注销广播接收者,参数为广播接收者对象。

public class MainActivity extends AppCompatActivity {
    private MyBroadcastReceiver receiver;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //创建广播接收者对象
        receiver=new MyBroadcastReceiver();
        //创建过滤器,用于接收指定的广播
        String action="MyAction";
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction(action);
        //注册广播接收者,参数为广播接收者对象及过滤器
        registerReceiver( receiver , intentFilter );

    }

    protected void onDestory(){
        super.onDestory();

        //注销广播接收者
        unregisterReceiver( receiver );

    }
}

 动态注册的广播接收者是否被销毁依赖于注册广播接收者的组件,例如在Activity中注册了广播接收者,当Activity销毁时广播接收者也会被注销。

(2)静态注册

通过第2种方式创建广播接收者之后,AndroidStudio会自动在AndridManifest.xml文件中静态注册广播接收者。

<application
    ... ... >

    <receiver
        android:name=".MyBroadcastReceiver"
        android:enabled="true"
        android:exported="true">
    </receiver>

</application>

enabled属性表示是否可由系统实例化

exported属性表示是否可接收当前程序外的广播

二、广播的发送、接收

1.发送广播

//创建广播Intent,即包含action属性的Intent
Intent intent=new Intent();
intent.setAction( "myTestBroadcast" );
//发送广播
sendBroadcast(intent);

2.接收广播

//创建自定义的内容接收者对象
MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver();
//创建过滤器,用于接收指定的广播(本例中为action属性为"myTestBroadcast"的广播)
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction( "myTestBroadcast" );
//注册广播接收者
registerReceiver(myBroadcastReceiver,intentFilter);




protected void onDestory(){
    super.onDestory();

    //注销广播接收者
    unregisterReceiver( receiver );

}

三、广播类型

Andrid中提供了两种广播类型,分别是无序广播和有序广播。

1.无序广播

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

2.有序广播

有序广播是按照广播接收者声明的优先级别被依次接收,发送广播时,只会有一个广播按收者能够接收此消息;在此广播接收者中逻辑执行完毕之后,广播才继续传递。相比无序着,有序番的广播效率较低,但此类型广播的广播接收者是有先后顺序的,并可被拦截

(1)修改广播接收者的优先级

//创建自定义的内容接收者对象
MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver();
//创建过滤器,用于接收指定的广播(本例中为action属性为"myTestBroadcast"的广播)
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction( "myTestBroadcast" );

//设置IntentFilter(意图过滤器)优先级
intentFilter.setPriority(1000);

//注册广播接收者
registerReceiver(myBroadcastReceiver,intentFilter);

(2)拦截有序广播 

public class MyBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        
        //拦截广播  abort-中止,夭折
        abortBroadcast();
        
    }
}

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

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

相关文章

dockerfile中临时拉取gitlab代码

git clone https://<name>:<token>gitlab.com/<USER>/<REPO>.git

基于STM32F103C8T6的UAV飞控板硬件设计

一、主控单元&#xff1a; 主控单元基于意法半导体公司的STM32F103C8T6单片机进行设计。STM32F103C8T6DE 内核为ARM Cortex-M3&#xff1b;最大主频&#xff1a;72MHz &#xff1b;工作电压范围&#xff1a;2V~3.6V &#xff1b;程序存储容量&#xff1a;64KB&#xff1b; 程序…

qtableview委托应用

https://download.csdn.net/download/venice0708/88485153

Python构造代理IP池提高访问量

目录 前言 一、代理IP是什么 二、代理IP池是什么 三、如何构建代理 IP 池 1. 从网上获取代理 IP 地址 2. 对 IP 地址进行筛选 3. 使用筛选出来的 IP 地址进行数据的爬取 四、总结 前言 爬虫程序是批量获取互联网上的信息的重要工具&#xff0c;在访问目标网站时需要频…

【广州华锐互动】牛顿运动定律VR虚拟教学软件

在科技日新月异的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为我们带来了前所未有的沉浸式体验。在教育领域&#xff0c;VR技术的应用也日益广泛&#xff0c;尤其是在物理教学中&#xff0c;牛顿运动定律VR虚拟教学软件为学生…

预制件二维码怎么生成

在建筑施工领域&#xff0c;预制构件的使用越来越广泛&#xff0c;它能够提高工程质量和施工效率&#xff0c;减少施工现场对环境的影响。通过凡尔码的二维码管理平台&#xff0c;用户可以实现预制构件的高效管理&#xff0c;并提升施工效率和施工质量 预制件二维码怎么生成 准…

org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解

openfeign无法导入的问题 我感觉最近带的好几个新人在搭建springCloud基础框架的时候&#xff0c;会犯一个非常小的错误&#xff0c;导致进度卡住了。 这个错误就是Feign导入的错误&#xff1a; ‘dependencies.dependency.version’ for org.springframework.cloud:spring-c…

乐鑫 SoC 内存映射入门

微控制器 (MCU) 的性能和内存能力逐步提升&#xff0c;其复杂度也随之加大。特别是当用户需要配置内存管理单元来映射外部存储器芯片 (Flash/SPIRAM) 时&#xff0c;这种现象尤其明显。 开始在乐鑫 SoC 上运行 Zephyr RTOS 时&#xff0c;会发现这些 SoC 与 ARM 架构的 MCU 相…

Java进阶(HashMap)——面试时HashMap常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合&#xff0c;需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中HashMap集合的面试问题&#xff0c;结合源码分析题目背后的知识点。 关于List的博客文章如下&#xff1a; Java进阶&#xff08;List&#xff09;——面试…

CPU架构之x86解读

一&#xff0e;什么是x86架构 X86架构&#xff1a;是微处理器执行的计算机语言指令集&#xff0c;指一个intel通用计算机系列的标准编号缩写&#xff0c;也标识一套通用的计算机指令集。 编辑搜图 二、x86架构的优势 技术成熟&#xff1a;x86架构的芯片经过多年的发展&#…

Linux:KVM虚拟化

本章操作基于centos7系统 简介 KVM是Kernel Virtual Machine的简写&#xff0c;目前Redhat只支持在64位的Rhel5.4以上的系统运行KVM&#xff0c;同时硬件需要支持VT技术。KVM的前身是QEMU&#xff0c;在2008年被redhat公司收购并获得了一项hypervisor技术&#xff0c;不过redh…

UE学习记录08----Actor 绕指定Actor旋转

Sphere 以 Cube为中心点 在水平面 即 xy平面进行旋转 来源&#xff1a; UE4 actor绕着某个actor旋转 - 简书 (jianshu.com)

【EI会议征稿】第三届绿色能源与电力系统国际学术会议(ICGEPS 2024)

第三届绿色能源与电力系统国际学术会议&#xff08;ICGEPS 2024&#xff09; 2024 3rd International Conference on Green Energy and Power Systems 绿色能源是指可以直接用于生产和生活的能源。它包括核能和“可再生能源”。随着世界各国能源需求的不断增长和环境保护意识…

启动Vue项目报错Error: error:0308010C:digital envelope routines::unsupported

问题描述 启动Vue项目报错Error: error:0308010C:digital envelope routines::unsupported 出现这个一般就是node版本的问题&#xff0c;通过命令查看node -v查看node版本&#xff1b; 百度查了好多&#xff0c;都让我降低node版本&#xff0c;属实太麻烦了 在不改node版本的…

WhatsApp是什么?如何使用?有何功能?

相信很多做跨境的小伙伴对WhatsApp并不陌生&#xff0c;现在它是数十亿人使用的最受欢迎的即时通讯平台&#xff0c;每天在该平台上交换超过100亿条消息。它在全球200个国家地区拥有超过20亿用户&#xff0c;在60个国家属于常用通讯设备&#xff0c;是世界上最受欢迎的消息传递…

【广州华锐互动】飞机诊断AR远程指导系统为工程师提供更多支持

随着科技的发展&#xff0c;飞机的维护工作也在不断进步。其中&#xff0c;AR&#xff08;增强现实&#xff09;技术的应用使得远程运维成为可能。本文将探讨AR在飞机诊断远程指导系统中的应用&#xff0c;以及它对未来航空维护模式的影响。 AR远程指导系统是一种使用增强现实技…

对接第三方接口鉴权

我们知道&#xff0c;做为一个web系统&#xff0c;少不了要调用别的系统的接口或者是提供接口供别的系统调用。从接口的使用范围也可以分为对内和对外两种&#xff0c;对内的接口主要限于一些我们内部系统的调用&#xff0c;多是通过内网进行调用&#xff0c;往往不用考虑太复杂…

虹科干货 | CAN与CAN FD总线常见故障诊断及解决

全文导读&#xff1a;CAN总线凭借着可靠、实时、经济和灵活的优势&#xff0c;在汽车、工业等领域得到广泛应用&#xff0c;并逐渐普及到电池储能、医疗器械、智能大楼等应用场景中。随着CAN总线在越来越多领域得到应用&#xff0c;CAN总线测试的需求也逐渐增多。本文主要总结了…

c++之内联函数

要学习内联函数&#xff08;inline&#xff09;&#xff0c;首先我们要复习一下宏的缺点 我们的目的就是用内联函数去替代宏。 内联函数类似与宏的优点&#xff0c;但是克服了宏的缺点。&#xff08;内联函数编译器通过宏实现了内联函数&#xff09; 但是一般只适合小函数&…

车载网关产品解析(附:车载网关详细应用案例及部署流程)

5G车载网关是一款功能强大的工业级无线通讯设备。它集成了4G/5G双模网络模块、M12接口设计、强大的路由和安全功能等特性,可以为车载和移动应用提供稳定可靠的无线数据连接。 链接直达&#xff1a;https://www.key-iot.com/iotlist/sv900.html ### 产品特性 5G车载网关最大的…