Android——动态注册广播

BroadcastReceiver

发送一条广播,可以被不同的广播接收者所接收,广播接收者收到广播后再进行逻辑判断。

标准广播

通过 new BroadcastReceiver() 创建广播
通过 registerReceiver() 注册广播
通过 sendBroadcast() 发送广播
通过 unregisterReceiver() 注销广播

    @Overrideprotected void onStart() {super.onStart();receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(BroadStandardActivity.BROAD_ACTION_COME)) {btn_send.setText("来了");}}};// 创建一个意图过滤器,只处理 BROAD_ACTION_COME 的广播IntentFilter filter = new IntentFilter(BroadStandardActivity.BROAD_ACTION_COME);//注册接收器registerReceiver(receiver, filter);}
发送标准广播
    @Overridepublic void onClick(View view) {Intent intent = new Intent(BroadStandardActivity.BROAD_ACTION_COME);sendBroadcast(intent);}

案例代码

有序广播

  • 一个广播存在多个接收器,这些接收器需要排队收听广播,这意味着该广播是条有序广播。
  • 先收到广播的接收器A,既可让其他接收器继续收听广播,也可中断广播不让其他接收器收听。

通过 sendOrderedBroadcast() 发送广播
通过 setPriority()设置优先级,数字越大,优先级越高

    @Overrideprotected void onStart() {super.onStart();/** 多个接收器处理有序广播的规则:* 1、优先级越大的接收器,越早收到有序广播* 2、优先级相同的时候,越早注册的接收器越早收到有序广播* *//** 创建接收器A* */receiverA = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(ORDER_ACTION)) {btn_send_order.setText("来了A");}}};IntentFilter filterA = new IntentFilter(ORDER_ACTION);filterA.setPriority(8);registerReceiver(receiverA, filterA);/** 创建接收器B* */receiverB = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(ORDER_ACTION)) {btn_send_order.setText("来了");abortBroadcast();// 中断广播,此时后面的接收器无法收到该广播}}};IntentFilter filterB = new IntentFilter(ORDER_ACTION);filterB.setPriority(10);registerReceiver(receiverB, filterB);}

abortBroadcast():中断广播,让其它广播接收者无法收到该广播
clearAbortBroadcast():这个方法是针对上面的abortBroadcast()方法的,用于取消截获广播。这样它的下一级广播接收者就能够收到该广播了。
getAbortBroadcast():判断是否调用了 abortBroadcast,如果先调用 abortBroadcast,接着再调用 getAbortBroadcast,将返回 true; 如果在调用 abortBroadcastclearAbortBroadcastgetAbortBroadcast,将返回 false;

发送有序广播
    @Overridepublic void onClick(View view) {Intent intent = new Intent(ORDER_ACTION);/** 发送有序广播* 第二个参数:广播接收者所需要的权限(有些广播的是需要权限的)* */sendOrderedBroadcast(intent, null);}

案例代码

系统分钟到达广播

安卓系统每到1分钟就会发送一条广播,此时我们可以接受这个广播。

通过 Intent.ACTION_TIME_TICK 进行Action过滤

	IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);

网络变更广播

    private void netWorkReceiver() {receiverNet = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null) {NetworkInfo networkInfo = intent.getParcelableExtra("networkInfo");String text = String.format("网络大类为%s,网络小类为%s,网络状态为%s",networkInfo.getTypeName(),networkInfo.getSubtypeName(),networkInfo.getState().toString());tv_tip.setText(text);}}};IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");registerReceiver(receiverNet, filter);}

定时管理器

Android提供了专门的定时管理器 AlarmManager,它利用系统闹钟定时发送广播,常见方法:

  • set:设置一次性定时器
  • setAndAllowWhileIdle:设置一次性定时器,即使设备处于空闲状态,也会保证执行定时器。
  • setRepeating:设置重复定时器,但系统不保证按时发送广播。
  • cancel:取消指定延迟意图的定时器。

注册接收者 AlarmReceiver

        // 上下文传 getApplicationContext() ,而非 this(当前Activity),为了避免内存泄漏alarmReceiver = new AlarmReceiver(getApplicationContext());IntentFilter filter = new IntentFilter(AlarmReceiver.ALARM_ACTION);registerReceiver(alarmReceiver, filter);
发送闹钟广播

定时管理使用了PendingIntent,它与Intent之间的差异主要有下列三点:

  • PendingIntent 代表延迟意图,它指向的组件不会马上激活;而Intent代表实事的意图,它指向的组件会马上激活
  • PendingIntent 是一类消息的组合,不但包含目标的Intent对象, 还包含请求代码、请求方式等信息。
  • PendingIntent 对象在创建之时便已知晓将要用于活动还是广播。
    public void sendAlarm() {Intent intent = new Intent(ALARM_ACTION);// 创建一个用于广播的延迟意图// 针对 S+ (版本1000及更高版本)要求创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE// 强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent,是可变时才使用 FLAG_MUTABLEPendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE);// 从系统服务中获取闹钟管理器AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 允许在空闲时发送广播,Android6.0之后新增的方法alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 3000, pendingIntent);} else {// 设置一次性闹钟,延迟若干秒后,携带延迟意图发送闹钟广播(但Android6.0之后,set方法在暗屏时不保证发送广播,必须调用setAndAllowWhileIdle方法)alarmManager.set(AlarmManager.RTC_WAKEUP, 3000, pendingIntent);}}
设置重复闹钟
// 设置重复闹钟,每隔一定间隔就发送闹钟广播(但从Android4.4开始,setRepeating方法不保证按时发送广播)
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000, pendingIntent);
    @Overridepublic void onReceive(Context context, Intent intent) {if (intent != null && intent.getAction().equals(ALARM_ACTION)) {Log.d("AAAA", "收到广播了");// setRepeating 有问题,在接收到广播后又调用一次sendAlarm();}}

案例代码

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

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

相关文章

HyperWorks进阶教程:Altair及其软件介绍

1.1 Altair 简介 Allair是一家全球技术公司,在产品开发、高性能计算和数据智能领域提供软件和云解决方案自1985年成立以来一直致力于为企业的决策者和技术的执行者开发用于仿真分析、优化、信息可视化、流程自动化和云计算的高端技术。Altair 公司的总部位于美国密…

Halcon3D image_points_to_world_plane详解

分三个部分来聊聊这个算子 一,算子的参数介绍 二,算法的计算过程 三,举例实现 第一部分,算子的介绍 image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y) 参数介绍: CameraParam,:相机内参 WorldPose 世界坐标系,也叫物体坐标系(成…

使用GetX实现GetPage中间件

前言 GetX 中间件(Middleware)是 GetX 框架中的一种机制,用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件,可以有效地控制用户的访问流程,并在适当条件下引导用户到所需页面。 这…

【人工智能-初级】练习题:matplotlib基础练习30例

文章目录 练习 1: 画折线图练习 2: 画散点图练习 3: 画柱状图练习 4: 画饼图练习 5: 画直方图练习 6: 使用不同线型画折线图练习 7: 多条折线练习 8: 用不同颜色画散点图练习 9: 画堆叠柱状图练习 10: 画带网格的图练习 11: 画带标签的散点图练习 12: 画等高线图练习 13: 在图中…

[java][基础]HTTPTomcatServlet

1,Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 在我们日常的生活中,经常会使用浏览器去访问百度、京东、传智官网等这些网站,这些网站统称为Web网站。如下就是通…

CUDA环境安装终极指南——Linux(其它系统也一样)

文章目录 前言检查驱动配置nvcc安装cudnn完活 前言 不用看其它文章了,这篇文章保你不踩任何坑,安装方法简单快速 检查驱动 检查驱动是否安装,输入以下命令 nvidia-smi如果驱动已经安装,则可跳过此步,否则&#xff…

基于MATLAB的身份证号码识别系统

课题介绍 本课题为基于连通域分割和模板匹配的二代居民身份证号码识别系统,带有一个GUI人机交互界面。可以识别数十张身份证图片。 首先从身份证图像上获取0~9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像…

OpenCV—calcHist()函数

void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,SparseMat& hist, int dims,const int* histSize, const float** ranges,bool uniform true, bool accumulate false ); images 输入的数据指针,要具备相同的尺寸和数…

小米内外衣双区洗双洗烘洗衣机:洗出健康,还是洗出“噱头”

大家好,我是小悟。 在我们生活的这个科技飞速发展的时代,没有什么是一成不变的,就连洗衣机都在不断地推陈出新,生怕自己被时代的洪流甩在后面。这不,前不久,小米就又给我们带来了一款“划时代”的产品——…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

C++STL——list

C教学总目录 list 1、list简介2、构造函数3、迭代器4、访问和容量函数5、修改类函数6、操作类函数 1、list简介 list是带头双向循环链表&#xff0c;也是模板类&#xff0c;使用时要指明类型&#xff0c;包含于头文件<list> 由于list是双向循环链表&#xff0c;在任意位置…

unocss 添加支持使用本地 svg 预设图标,并支持更改大小

安装 pnpm install iconify/utils 在配置文件 unocss.config.ts&#xff1a; presets > presetIcons 选项中 通过 FileSystemIconLoader 加载本地图标&#xff0c;并指定目录。 import presetWeapp from unocss-preset-weapp import { extractorAttributify, transformer…

转换流详解

在Java中&#xff0c;处理文本数据时&#xff0c;我们经常需要将字节流转换为字符流&#xff0c;或者将字符流转换为字节流。这种转换通常用于读取文本文件或将数据从网络传输到应用程序。Java提供了两种主要的转换流&#xff1a;InputStreamReader 和 OutputStreamWriter。 1…

广东网站设计提升你网站在搜索引擎中的排名

在当今网络盛行的时代&#xff0c;拥有一个设计优良的网站&#xff0c;对企业的在线发展至关重要。特别是对于广东地区的企业来说&#xff0c;网站设计不仅仅是美观的问题&#xff0c;更直接影响着搜索引擎中的排名。因此&#xff0c;精心策划和设计的网站&#xff0c;能够显著…

VisualStudio远程编译调试linux_c++程序(二)

前章讲述了gdb相关&#xff0c;这章主要讲述用VisualStudio调试编译linux_c程序 1&#xff1a;环境 win10 VisualStudio 2022 Community ubuntu22.04 2:安装 1>vs安装时&#xff0c;勾选 使用c进行linux 和嵌入式开发 (这里以vs2022为例) OR VS安装好了&#xff0c; 选择工…

深入理解高频电路中的S参数

高频电路的设计与分析在现代电子工程中占据了重要地位,尤其是在射频和微波领域。随着技术的发展,网络分析法逐渐成为研究高频电路的重要工具,而S参数则是其中的核心概念之一。 一、S参数的基本概念 S参数,即散射参数,是用来描述电路中信号的入射、反射和传输特性的参数。…

Netty 常见组件介绍

Netty 常见组件介绍 上篇文章Netty入门程序echo 基本包含了Netty常见的组件&#xff0c;本文分别介绍各个组件 Bootstrap or ServerBootstrapEventLoopEventLoopGroupChannelPipelineChannelFuture or ChannelFutureChannelInitializerChannelHandler Bootstrap vs ServerBo…

el-talble selection行 初始默认勾选

导言 el-talble selection 行&#xff08;选择列&#xff09;用于显示复选框&#xff0c;让用户可以选择或取消选择某些表格行&#xff0c;常用于批量操作场景。 刚刚试了下&#xff0c;想加深印象记录一下当学习碎片。参考的是表格多选并根据每行值初始化选中状态&#xff08;…

HTML 块级元素和内联(行内)元素详解

在 HTML 中,元素根据它们在页面中的表现方式分为两类:块级元素 和 内联元素(行内元素)。了解块级元素和内联元素的特性与使用方法,是掌握HTML开发的重要基础。本文将深入探讨这两类元素的特点及其在实际开发中的应用。 文章目录 一、块级元素1.1 块级元素是什么?1.2 块级…

使用Docker构建和部署微服务

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 [TOC] Docker 是一个开源的容器化平台&#xff0c;可以帮助开发者轻松构建、打包和部署应用程序。本文将详细介绍如何使用 Dock…