[Android 四大组件] --- BroadcastReceiver
1 BroadcastReceiver是什么
BroadcastReceiver(广播接收器)即广播,是一个全局的监听器。
Android 广播分为两个角色:广播发送者、广播接受者。
2 广播类型
广播按照类型分为两种,一种是全局广播,另一种是本地广播
全局广播:就是发出的广播被其他任意应用程序接收,或者可以接收来自其他任意应用程序的广播。
本地广播:则是只能在应用程序内部进行传递的广播,广播接收器也只能接收内部的广播,不能接收其他应用程序的广播
广播按照机制分两种,一种是标准广播,一种是有序广播
标准广播:是一种异步的方式来进行传播的,所有接收者都会接收事件,不可以被拦截,不可以被修改
有序广播:是一种同步执行的广播,按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。
3 BroadcastReceiver原理
// 模型
基于消息的发布/订阅事件模型,使用了设计模式中的观察者模式;
// 模型角色:
1.消息订阅者
2.消息发布者
3.消息中心(AMS,即Activity Manager Service)
// 原理描述
1.广播接收者 通过Binder机制在AMS注册
2.广播发送者 通过Binder机制向AMS发送广播
3.AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter/Permission)
4.AMS将广播发送到合适的广播接收者相应的消息循环队列中
5.广播接收者通过消息循环拿到此广播,并回调onReceive()
4 动态注册
给出一个示例:用BroadcastReceiver实现2个activity之间的通信,点击A页面,跳转到B页面,在B页面发送广播,A页面收广播
//AActivity.java
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import androidx.annotation.Nullable;public class AActivity extends AppCompatActivity {private DynamicBRReceiver dynamicBRReceiver;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.a_activity_layout);// 动态注册广播接收器dynamicBRReceiver = new DynamicBRReceiver();IntentFilter itFilter = new IntentFilter();itFilter.addAction("com.example.broadcasttest.DynamicBRReceiver");registerReceiver(dynamicBRReceiver, itFilter);findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(AActivity.this, BActivity.class);startActivity(intent);}});}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(dynamicBRReceiver);}
}
// BActivity.javapackage com.example.myapplication;import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class BActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.b_activity_layout);findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//发送广播// 动态注册方式发送Intent intent = new Intent("com.example.broadcasttest.DynamicBRReceiver");sendBroadcast(intent);}});}
}
```java
// DynamicBRReceiver.java
package com.example.myapplication;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class DynamicBRReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "DynamicBRReceiver: 收到广播!!!", Toast.LENGTH_SHORT).show();}
}
注意:
1.广播接收器接收到相应广播后,会自动回调onReceive方法
2.一般情况下,onReceive方法会涉及与其它组件之间的交互,如发送Notification、启动Service
3.默认情况下,广播接收器运行在UI线程,因此onReceive方法不能执行耗时操作,否则将导致ANR。
5 静态注册
静态注册的方式需要在AndroidManifest.xml中注册
<receiver android:name="com.example.myapplication.StaticBRReceiver"><intent-filter><action android:name="com.example.broadcasttest.StaticBRReceiver" /></intent-filter></receiver>
// BActivity.javapackage com.example.myapplication;import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class BActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.b_activity_layout);findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 静态注册方式发送Intent intent = new Intent();intent.setComponent(new ComponentName(BActivity.this, StaticBRReceiver.class));sendBroadcast(intent);}});}
}
// StaticBRReceiver.java
package com.example.myapplication;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;// 静态注册
public class StaticBRReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "StaticBRReceiver: 收到广播!!!", Toast.LENGTH_SHORT).show();}
}
6 动态注册和静态注册的区别
// 使用方式:
静态注册是在AndroidManifest文件中使用receiver标签注册的,动态注册是在代码中调用Context.registerReceiver方法
// 特点:
静态注册是常驻广播,不受任何组件的生命周期影响(应用程序关闭后,依旧可以会被系统调用),缺点是耗电,占内存
动态注册是非常驻广播,灵活,跟随组件的生命周期变化(组件结束=广播结束,在组件结束之前必须移除广播接收器)
// 应用场景:
当需要时刻监听广播时,使用静态注册方式;当只需要在特定时刻监说明听广播时,使用动态注册的方式
相关文章:
[Android 四大组件] --- BroadcastReceiver
1 BroadcastReceiver是什么 BroadcastReceiver(广播接收器)即广播,是一个全局的监听器。 Android 广播分为两个角色:广播发送者、广播接受者。 2 广播类型 广播按照类型分为两种,一种是全局广播,另一种…...
<C++> STL_容器适配器
1.容器适配器 适配器是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口。 容器适配器是STL中的一种重要组件,用于提供不同的数据结构接口,以满足特定的需求和限制。容器适配器是基于其他STL容器构建的,通过…...
【25考研】- 整体规划及高数一起步
【25考研】- 整体规划及高数一起步 一、整体规划二、专业课870计算机应用基础参考网上考研学长学姐: 三、高数一典型题目、易错点及常用结论(一)典型题目(二)易错点(三)常用结论1.令tarctanx, 则…...
【Unity】常见的角色移动旋转
在Unity 3D游戏引擎中,可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式: 欧拉角(Euler Angles):欧拉角是一种常用的旋转表示方法,通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Un…...
今天的小结
1、冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历待排序的元素列表,比较相邻的元素并交换它们的位置,直到整个列表排序完成。冒泡排序的基本思想是通过不断交换相邻元素,将最大&#…...
了解 Socks 协议:它的过去、现在与未来
在网络世界的江湖中,有一名叫做 Socks 协议的高手,它凭借着一招“代理”绝技,在网络安全领域独步天下。今天,就让我们来了解一下这位神秘高手的过去、现在和未来。 在过去,互联网世界的江湖可谓是风起云涌,…...
小谈静态类和单例模式
静态类(Static Class)和单例(Singleton)都是在编程中用于实现特定类型的设计模式或代码组织方式。它们在不同的情境下有不同的用途和特点。 静态类(Static Class) 静态类是一种类,它的方法和属…...
LeetCode解法汇总823. 带因子的二叉树
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给出一个含…...
TypeScript的变量声明的各种方式
TypeScript是一种静态类型的JavaScript超集,它为JavaScript代码提供了类型检查和更好的代码组织结构。在TypeScript中,变量声明是非常重要的,因为它们定义了变量的类型和范围。本文将详细介绍TypeScript的变量声明,并通过代码案例…...
c++ lambda
Lambda Lambda 表达式一般用于定义匿名函数,使得代码更加灵活简洁,优点: 声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可…...
泊松回归和地理加权泊松回归
01 泊松回归 泊松回归(Poisson Regression)是一种广义线性模型,用于建立离散型响应变量(计数数据)与一个或多个预测变量之间的关系。它以法国数学家西蒙丹尼泊松(Simon Denis Poisson)的名字命名,适用于计算“事件发生次数”的概率,比如交通事故发生次数、产品缺陷数…...
【数学建模竞赛】各类题型及解题方案
评价类赛题建模流程及总结 建模步骤 建立评价指标->评价体系->同向化处理(都越多越好或越少越少)->指标无量纲处理 ->权重-> 主客观->合成 主客观评价问题的区别 主客观概念主要是在指标定权时来划分的。主观评价与客观评价的区别…...
【12期】谈一谈redis两种持久化机制的区别?
Redis两类持续性的方法 RDB方案可以在规定时间间隔内创建数据集的时间点快照。 AOF方案记录了服务器执行的所有写操作命令,并在服务器启动时通过重新执行这些命令来还原数据集。AOF文件完全遵循Redis协议格式保存,新命令会被追加到文件末尾。此外&#…...
Lambda 编程(Kotlin)一
学习记录,以下为个人理解 知识点: Lambda的定义:允许你把代码块当作参数传递给函数Lambda的语法约定:如果lambda 表达式是函数调用的最后一个实参,它可以放到括号的外边当lambda表达式时函数唯一的实参时,…...
网络字节序——TCP接口及其实现简单TCP服务器
网络字节序——TCP接口及其实现简单TCP服务器 文章目录 网络字节序——TCP接口及其实现简单TCP服务器简单TCP服务器的实现1. 单进程版:客户端串行版2. 多进程版:客户端并行版netstat查看网络信息3.多线程版:并行执行log.hpp 守护进程fg、bg s…...
RxJS如何根据事件创建Observable对象?
RxJS提供了一些用来创建Observable对象的函数,我们可以根据事件、定时器、Promise,AJAX等来创建Observable对象。 下面是根据事件创建Observable对象的几个例子。 this.outsideClick$ fromEvent(document, click).subscribe((event: MouseEvent) > …...
网站常见安全漏洞 | 青训营
Powered by:NEFU AB-IN 文章目录 网站常见安全漏洞 | 青训营 网站基本组成及漏洞定义服务端漏洞SQL注入命令执行越权漏洞SSRF文件上传漏洞 客户端漏洞开放重定向XSSCSRF点击劫持CORS跨域配置错误WebSocket 网站常见安全漏洞 | 青训营 网站常见安全漏洞-网站基本组成及漏洞定义…...
vue2使用 vis-network 和 vue-vis-network 插件封装一个公用的关联关系图
效果图: vis组件库:vis.js vis-network中文文档:vis-network 安装组件库: npm install vis-network vue-vis-network 或 yarn add vis-network vue-vis-network 新建RelationGraph.vue文件: <template><…...
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。
LeetCode第73题矩阵置零 1.思路: 想到一个开辟一点空间来解决方法,使用哈希集。就是使用一个哈希集(row和col)来储存数组中的元素为0的下标。然后再遍历,整个二维数组,在哈希集中存在对应的下标,…...
java-初识Servlet,Tomcat,JDBC
文章目录 前言一、ServletServlet 生命周期Servlet 实例Servlet 过滤器 二、TomcatJDBCJDBC连接数据库实例 总结 前言 java入门须知的重要概念/名词/技术 等 一、Servlet Servlet是Java Web开发中的一个核心组件,它是基于Java语言编写的服务器端程序,…...
别再折腾超级密码了!2024年电信光猫改桥接,打这个电话最快(附完整话术)
2024年电信光猫改桥接最省心方案:一通电话搞定全流程 去年帮邻居调试网络时,发现一个有趣的现象——十个尝试自己破解光猫超级密码的用户里,有九个会卡在第一步。不是密码失效就是界面改版,最后不得不求助运营商。这让我意识到&am…...
FLUX.1-dev FP8量化模型:让中低端显卡畅享专业级AI图像生成的终极方案
FLUX.1-dev FP8量化模型:让中低端显卡畅享专业级AI图像生成的终极方案 【免费下载链接】flux1-dev 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/flux1-dev 在AI图像生成技术快速发展的今天,硬件限制成为许多开发者和创作者面临的主要…...
iTorrent:iPhone上最强大的种子下载器终极指南
iTorrent:iPhone上最强大的种子下载器终极指南 【免费下载链接】iTorrent Torrent client for iOS 16 项目地址: https://gitcode.com/gh_mirrors/it/iTorrent 想在iPhone上轻松下载种子文件,却苦于iOS系统限制?iTorrent这款专业的iOS…...
NebulaGraph Console终极指南:简单快速掌握图数据库命令行工具
NebulaGraph Console终极指南:简单快速掌握图数据库命令行工具 【免费下载链接】nebula-console Command line interface for the Nebula Graph service 项目地址: https://gitcode.com/gh_mirrors/ne/nebula-console NebulaGraph Console是NebulaGraph图数据…...
紧急更新|Midjourney即将下线--blueprint实验性指令!最后48小时掌握蓝晒法风格不可逆生成逻辑
更多请点击: https://intelliparadigm.com 第一章:Midjourney蓝晒法风格的底层视觉基因解码 蓝晒法(Cyanotype)作为19世纪诞生的古典摄影工艺,其视觉基因并非仅由普鲁士蓝染料决定,而是一套由化学反应、物…...
linuxcnc开发环境搭建
linux cnc ,数控机床开源控制软件,实时系统。下载linuxcnc.iso镜像,在虚拟机里安装。安装成功运行起来。安装了amd64版本的qtcreator运行提示少libxcb:sudo apt update sudo apt install libxcb-cursor0打开窗口成功新建 一个工程…...
Spring AI Alibaba 1.x 系列【55】Interrupts 中断机制:静态中断源码分析
文章目录 1. interruptBefore 模式1.1 中断判断逻辑1.2 构建中断元数据1.3 返回中断响应1.4 初始化【中断执行】上下文1.5 合并状态(BUG)1.6 执行结束 2. interruptsAfter 模式2.1 设置 INTERRUPT_AFTER 标记2.2 动态计算下一个节点 3. 中断时机对比 1. …...
RUST编程学习.2语法
目录 前言 一、思维导图 二、Rust语法专属 1.迭代器 2.生命周期 总结 前言 在进行编译器下载后,就可以写代码进行编译调试了,在这之前就是要学习rust语法,在学习的过程中我整理了一版思维导图,最直观的感觉就是rust的语法很…...
AI Newsletter的本质:一种高信噪比的信息过滤与认知校准方法论
1. 项目概述:一份“AI Newsletter”背后的真实工作流与信息筛选逻辑你点开邮箱,看到标题为This AI newsletter is all you need #41的邮件——它没用夸张的“爆炸性突破”“颠覆认知”这类词,也没塞满emoji和感叹号,但你还是点了开…...
JWT密钥轮换缺陷与零停机热修复实战指南
1. 这不是一次普通升级,而是一次密钥信任体系的临界点崩塌Seedance2.0 v2.0.3发布不到72小时,我在给客户做例行安全巡检时,发现一个反直觉的现象:所有新签发的JWT令牌在旧版本客户端(v2.0.2)上验证失败&…...
