当前位置: 首页 > news >正文

【Android】四大组件之BroadcastReceiver

目录

一、什么是BroadcastReceiver

二、创建和使用BroadcastReceiver

三、跨应用广播接收权限

四、广播方式

五、广播类型与特性

六、BroadcasReceiver注册方式

七、BroadcasReceiver工作流程


你可以把广播接收器想象成一个“收音机”。它的作用是监听系统或应用发出的“广播消息”,并在收到消息后执行相应的操作。

一、什么是BroadcastReceiver

BroadcastReceiver用于监听系统或应用发出的广播事件,实现跨组件通信。其特点是发送方无需关注接收方是否存在或如何处理数据

1. 广播的类型

  • 系统广播:由系统发出,比如电池电量低、网络状态变化、屏幕开关等。

ACTION_BATTERY_LOW:电池电量低。

ACTION_BOOT_COMPLETED:设备启动完成。

  • 自定义广播:由应用发出,用于应用内部或应用之间的通信。

在App中定义一个广播,比如“任务完成”,然后在其他地方接收并处理。

2. 生命周期管理

广播接收器的生命周期非常短暂,它只存在于接收到广播并处理完广播的这段时间内。

  • 接收广播:当广播发出时,系统会创建广播接收器的实例,并调用它的onReceive()方法。
  • 完成任务:onReceive()方法执行完毕后,广播接收器的实例就会被销毁。

3. 典型场景

典型场景实现方案
强制下线功能发送全局广播通知所有界面退出登录,动态注册接收器处理跳转逻辑
多应用协同通过自定义广播与权限控制,实现应用间数据传递与功能触发
系统事件响应静态注册监听 SCREEN_ON/SCREEN_OFF 等系统广播,实现锁屏/亮屏逻辑

二、创建和使用BroadcastReceiver

1‌. 继承基类

新建类继承 BroadcastReceiver,并重写 onReceive() 方法:

public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();// 处理广播逻辑,如弹出 ToastToast.makeText(context, "收到广播", Toast.LENGTH_SHORT).show();}
}

onReceive() 方法执行时间需控制在 10 秒内,否则会触发 ANR 错误。

建议复杂逻辑通过 IntentService 或 WorkManager 异步处理。

2. 注册广播接收器

广播接收器可以通过两种方式注册:

  • 动态注册(接收方代码中注册):需手动注册和注销,生命周期与注册的 Context(如 Activity)绑定,应用关闭后失效。

// 注册
IntentFilter filter = new IntentFilter("CUSTOM_ACTION");
MyReceiver receiver = new MyReceiver();
registerReceiver(receiver, filter);// 注销(如 onDestroy 中)
unregisterReceiver(receiver);

为避免内存泄漏,动态注册的接收器需在适当时机(如 onDestroy())注销 。  

  • 静态注册(接收方AndroidManifest.xml):应用未启动时也能接收广播(如系统启动完成事件),但 Android 8.0+ 对隐式广播有限制。

// BroadcastReceiver使用者(接收方)的AndroidManifest.xml
// 允许应用监听设备启动完成的广播
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".MyReceiver"><intent-filter><action android:name="CUSTOM_ACTION" /><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter>
</receiver>

Android 8.0+ 限制‌:针对隐式广播(非定向广播),静态注册可能失效,需改用动态注册或使用豁免列表中的广播 。

3. 发送广播

  • 发送标准广播
Intent intent = new Intent("CUSTOM_ACTION");
intent.putExtra("data", "Hello");
sendBroadcast(intent);
  • 发送有序广播:可设置优先级和拦截广播
// 发送方代码:发送有序广播
Intent intent = new Intent("ORDERED_ACTION");
sendOrderedBroadcast(intent, null);// 接收方配置:接收器中设置优先级(AndroidManifest.xml)
<intent-filter android:priority="100"><action android:name="ORDERED_ACTION" />
</intent-filter>// 接收方代码:在 onReceive() 中拦截广播
abortBroadcast();

敏感广播需添加权限控制,防止恶意应用拦截。

三、跨应用广播接收权限

场景发送方配置接收方配置
sendBroadcast() 附加权限定义 <permission>,无需声明权限声明 <uses-permission>
<receiver> 设置权限声明 <uses-permission>定义 <permission>在 <receiver> 中绑定

 1. 发送方通过 sendBroadcast() 附加权限

发送方需在自身 AndroidManifest.xml 中通过 <permission> 标签定义权限。

<permission android:name="com.example.SEND_PERMISSION" android:protectionLevel="signature" />  

发送广播时需指定此权限:

sendBroadcast(intent, "com.example.SEND_PERMISSION");  

发送方无需通过 <uses-permission> 声明该权限,而‌接收方需在 Manifest 中声明该权限‌,否则无法接收广播:

<uses-permission android:name="com.example.SEND_PERMISSION" />

若权限的 protectionLevel 设为 signature,发送方与接收方需使用相同签名。

也就是说,发送方与接收方应用必须使用相同的数字证书(即开发者签名密钥)进行签名‌。 

2. 接收方通过 <receiver> 标签的 android:permission 属性限制发送方权限

接收方需在 Manifest 中定义新权限‌(如 RECEIVE_PERMISSION),并在 <receiver> 标签中设置:

<permission android:name="com.example.RECEIVE_PERMISSION" />  
<receiver  android:name=".MyReceiver"  android:permission="com.example.RECEIVE_PERMISSION">  <intent-filter>...</intent-filter>  
</receiver>  

 ‌发送方需在自己的 Manifest 中声明该权限‌,否则发送的广播会被接收方拒绝:

<uses-permission android:name="com.example.RECEIVE_PERMISSION" />  

系统广播应用场景

  • 监听开机启动‌:静态注册 BOOT_COMPLETED 广播,需声明权限 RECEIVE_BOOT_COMPLETED
  • 监听网络变化‌:动态注册 CONNECTIVITY_CHANGE 广播,需权限 ACCESS_NETWORK_STATE

四、广播方式

特性显式广播隐式广播
目标范围明确指定接收方组件或包名通过 IntentFilter 匹配所有符合条件的接收方
注册限制允许接收方静态注册(Android 8.0+ 无限制)禁止接收方静态注册(Android 8.0+ 限制)
通信范围适用于定向通信(如应用内部或特定合作应用)适用于广播全局事件(如系统事件通知)
安全性更高(需明确目标权限或签名验证)较低(可能被恶意应用劫持)

1. 显示广播

  • 指定报包名
Intent intent = new Intent("CUSTOM_ACTION");  
intent.setPackage("com.example.receiverapp"); // 限定接收方包名  
sendBroadcast(intent);  
  • 指定组件类名
Intent intent = new Intent("CUSTOM_ACTION");  
intent.setComponent(new ComponentName("com.example.receiverapp", "com.example.ReceiverClass"));  
sendBroadcast(intent);  

显式广播通过精确指定接收方身份,绕过 Android 8.0+ 对隐式广播静态注册的限制,适用于需定向通信的场景。开发者应优先使用动态注册或显式广播,确保应用兼容性及安全性。

2. 隐式广播

发送方仅定义 Action,依赖接收方声明的 IntentFilter 匹配广播,适用于全局事件通知。

Intent intent = new Intent("CUSTOM_ACTION");  
sendBroadcast(intent); // 不指定目标接收方  

隐式广播的发送方仅需在代码中定义 Intent 的 Action 并发送,‌无需在 XML 文件中进行任何配置‌。接收方需自行处理 IntentFilter 的注册与适配规则。 

五、广播类型与特性

1. 普通广播(标准广播)

所有接收器‌并行接收‌,无顺序限制,无法终止传播。

sendBroadcast(new Intent("com.example.ACTION_STANDARD"));  

2. ‌有序广播(Ordered Broadcast)

接收器‌按优先级顺序处理‌,可中断传播或修改数据。

发送方式:

sendOrderedBroadcast(intent, null);  

接收方注册:

<receiver android:name=".HighPriorityReceiver">  <intent-filter android:priority="1000">  <action android:name="com.example.ACTION_ORDERED" />  </intent-filter>  
</receiver>  

3. 本地广播(Local Broadcast)

仅在应用内部传递广播,避免跨应用风险(已弃用 LocalBroadcastManager,推荐 LiveData 或 RxJava 替代)。

本地广播发送方式:

Intent localIntent = new Intent("com.example.ACTION_LOCAL");  
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);  

六、BroadcasReceiver注册方式

对比维度静态注册动态注册
注册方式在 AndroidManifest.xml 中通过 <receiver> 标签声明在代码中通过 registerReceiver() 动态注册,需手动管理生命周期
生命周期管理独立于组件生命周期,系统自动创建和销毁(应用未运行也可接收广播)与注册上下文(如 Activity/Service)生命周期绑定,需在 onDestroy() 中手动注销
注册时机应用安装时完成,全局生效运行时按需注册,作用域可控
广播类型适配Android 8.0+ 受限:仅支持接收豁免的系统隐式广播无条件支持所有广播类型(显式/隐式)
系统兼容性需适配 Android 8.0+ 隐式广播限制无版本限制,适配性更强
性能影响长期占用系统资源(应用安装时即注册,增加系统负载)按需注册和释放资源,内存占用更灵活
安全性潜在风险:恶意应用可能监听隐式广播可控性高:仅应用运行时生效,且可限制接收范围(如权限控制)
适用场景需长期监听系统事件(如开机启动、网络变化)临时监听应用内事件(如用户交互触发的自定义广播)
代码复杂度配置简单,无需额外代码管理需编写注册/注销代码,逻辑复杂度更高
内存泄漏风险未及时注销会导致内存泄漏
资源占用长期占用系统资源,可能影响性能按需释放资源,优化内存使用

Android 8.0+ 隐式广播限制‌:

  • 静态注册仅支持部分系统广播(如 ACTION_BOOT_COMPLETED)。
  • 动态注册或显式广播(指定包名/组件名)是兼容高版本的推荐方案。

安全性建议‌:

  • 静态注册需谨慎使用,优先通过权限(android:permission)限制接收方。
  • 动态注册可通过 LocalBroadcastManager(已弃用)或 LiveData 替代高频广播场景。

长期系统监听用静态注册,临时或安全敏感场景用动态注册。

避免静态注册高频广播,动态注册按需启停更灵活。

1. 静态注册示例

接收方创建 BroadcastReceiver 子类

public class MyStaticReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  String action = intent.getAction();  if ("com.example.STATIC_ACTION".equals(action)) {  String data = intent.getStringExtra("data");  Toast.makeText(context, "静态接收器: " + data, Toast.LENGTH_SHORT).show();  }  }  
}  

接收方在 AndroidManifest.xml 中声明

// 允许应用监听设备启动完成的广播
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver  android:name=".MyStaticReceiver"  android:enabled="true"  android:exported="true">  <intent-filter>  <action android:name="com.example.STATIC_ACTION" />  <!-- 可添加系统广播 Action(如开机完成) -->  <action android:name="android.intent.action.BOOT_COMPLETED" />  </intent-filter>  
</receiver>  

发送方发送广播代码

Intent intent = new Intent("com.example.STATIC_ACTION");  
intent.putExtra("data", "静态广播测试");  
sendBroadcast(intent);  

在 Android 3.1+ 系统中,应用需至少被用户手动启动一次;否则,即使声明权限,也无法接收开机广播。 

部分厂商系统(如 MIUI、EMUI)可能默认禁止应用自启动,需用户手动开启。

2. 动态注册示例

  接收方在 Activity 中注册与注销

public class MainActivity extends AppCompatActivity {  private BroadcastReceiver dynamicReceiver;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  // 动态注册接收器  dynamicReceiver = new BroadcastReceiver() {  @Override  public void onReceive(Context context, Intent intent) {  String data = intent.getStringExtra("data");  Toast.makeText(context, "动态接收器: "+ data, Toast.LENGTH_SHORT).show();  }  };  IntentFilter filter = new IntentFilter("com.example.DYNAMIC_ACTION");  registerReceiver(dynamicReceiver, filter);  }  @Override  protected void onDestroy() {  super.onDestroy();  // 必须手动注销  unregisterReceiver(dynamicReceiver);  }  
}  

发送方发送广播

Intent intent = new Intent("com.example.DYNAMIC_ACTION");  
intent.putExtra("data", "动态广播测试");  
sendBroadcast(intent);  

动态注册未及时调用 unregisterReceiver()会导致内存泄漏‌。

此外,在 onPause() 或 onDestroy() 中要及时注销接收器。

七、BroadcasReceiver工作流程

BroadcastReceiver的核心抽象类是android.content.BroadcastReceiver

public abstract class BroadcastReceiver {// 核心方法,用于接收广播public abstract void onReceive(Context context, Intent intent);// 其他方法,比如设置结果、获取结果等public final void setResultCode(int code) { ... }public final int getResultCode() { ... }public final void setResultData(String data) { ... }public final String getResultData() { ... }public final void setResultExtras(Bundle extras) { ... }public final Bundle getResultExtras(boolean makeMap) { ... }
}
  • 静态注册:由PackageManagerService解析AndroidManifest.xml并注册。
  • 动态注册:通过Context.registerReceiver()注册到ActivityManagerService。
  • 通过Context.sendBroadcast()发送广播,ActivityManagerService负责分发。
  • 分发广播:BroadcastQueue从队列中取出广播,并调用广播接收器的onReceive()方法处理。
  • 处理广播:广播接收器的onReceive()方法运行在主线程中,不能执行耗时操作。
  • 广播流程‌:事件触发 → 封装 Intent → 发送 → 接收处理 → 生命周期管理。

无论是静态还是动态注册,‌系统默认每次广播触发时都会创建新的BroadcastReceiver实例‌,并在 onReceive() 执行完毕后销毁 。

静态注册的接收器每次均由系统创建新实例,无法复用旧实例,因此不存在同一实例多次响应广播的情况。

动态注册时未及时调用 unregisterReceiver(),导致同一接收器实例被多次注册(如多次跳转同一 Activity 且未解注册),广播触发时系统会多次调用该实例的 onReceive() 。

// Activity 中重复注册同一接收器  
@Override  
protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  IntentFilter filter = new IntentFilter("com.example.ACTION_TEST");  registerReceiver(receiver, filter);  // 每次 Activity 创建都会注册一次  
}  

适配建议‌:遵循生命周期管理原则,避免非预期的重复注册与逻辑执行。

相关文章:

【Android】四大组件之BroadcastReceiver

目录 一、什么是BroadcastReceiver 二、创建和使用BroadcastReceiver 三、跨应用广播接收权限 四、广播方式 五、广播类型与特性 六、BroadcasReceiver注册方式 七、BroadcasReceiver工作流程 你可以把广播接收器想象成一个“收音机”。它的作用是监听系统或应用发出的“…...

[UVM]寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗?

寄存器模型的镜像值和期望值定义是什么&#xff1f;他们会保持一致吗&#xff1f; 摘要&#xff1a;在 UVM (Universal Verification Methodology) 寄存器模型中&#xff0c;镜像值 (mirrored value) 和期望值 (desired value) 是两个非常重要的概念&#xff0c;用于管理寄存器…...

OpenGL-ES 学习(12) ---- VBO EBO VAO

目录 VBO 定义VBO 创建统一VertexData使用 VBO 绘制VAO VBO 定义 VBO(Vertex Buffer Object) 是指顶点缓冲区对象&#xff0c;而 EBO(Element Buffer Object)是指图元索引缓冲区对象&#xff0c;VBO 和 EBO实际上是同一类 buffer 按照用途的不同称呼 OpenGL-ES2.0 编程中&…...

【Redis分布式】主从复制

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、主从复制 在分布式系统之中为了解决单点问题&#xff08;1、可用性问题&#xff0c;该机器挂掉服务会停止2、性能支持的并发量是有限的&#xff09;通常会把数据复制多…...

Node.js心得笔记

npm init 可用npm 来调试node项目 浏览器中的顶级对象时window <ref *1> Object [global] { global: [Circular *1], clearImmediate: [Function: clearImmediate], setImmediate: [Function: setImmediate] { [Symbol(nodejs.util.promisify.custom)]: [Getter] }, cl…...

多智能体空域协同中的伦理博弈与系统调停

在多智能体系统&#xff08;MAS&#xff09;广泛应用于低空飞行调度、应急响应与城市管理的背景下&#xff0c;AI之间的“协同”不仅是算法效率问题&#xff0c;更是伦理角色之间的权责动态博弈。尤其在高频互动、任务冲突、资源抢占等复杂场景中&#xff0c;智能体不再是“工具…...

面试中系统化地解答系统设计题:通用方法论

目录 一、明确需求(Clarify Requirements) (一)理解业务背景 (二)功能性需求(Functional Requirements) 1. 分析目标 2. 功能需求分类 A. 用户交互类功能 B. 数据处理类功能 C. 管理与运维类功能 D. 外部系统交互类功能 示例场景详解 3. 捕捉隐藏需求的技巧…...

kotlin中 热流 vs 冷流 的本质区别

&#x1f525; 冷流&#xff08;Cold Flow&#xff09; vs 热流&#xff08;Hot Flow&#xff09;区别 特性冷流&#xff08;Cold Flow&#xff09;热流&#xff08;Hot Flow&#xff09;数据生产时机每次 collect 才开始执行启动时就开始生产、始终运行生命周期与 collect 者…...

机器视觉开发-打开摄像头

以下是使用Python和OpenCV打开摄像头的最简单实现&#xff1a; import cv2# 打开默认摄像头&#xff08;通常是0&#xff09; cap cv2.VideoCapture(0)# 检查摄像头是否成功打开 if not cap.isOpened():print("无法打开摄像头")exit()print("摄像头已打开 - 按…...

Rerank详解

疑惑一 我对rag的流程理解是。后端首先建立embedding后的向量数据库&#xff0c;用户提问使用相同的embedding模型进行向量化&#xff0c;使用阈值控制相似度找出前topk个数据。然后rerank&#xff0c;将rerank的结果打包成prompt返回给大模型进行解答。我对于rerank的过程不是…...

深度探索DeepSeek:从架构设计到性能优化的实战指南

深度解码DeepSeek&#xff1a;从架构设计到工业级部署的全链路优化实践 引言&#xff1a;大模型时代的工程挑战 在人工智能技术进入工业化落地阶段的今天&#xff0c;大模型训练与推理的工程化能力已成为衡量企业技术实力的重要标尺。DeepSeek作为当前业界领先的超大规模语言…...

d202551

目录 一、175. 组合两个表 - 力扣&#xff08;LeetCode&#xff09; 二、511. 游戏玩法分析 I - 力扣&#xff08;LeetCode&#xff09; 三、1204. 最后一个能进入巴士的人 - 力扣&#xff08;LeetCode&#xff09; 一、175. 组合两个表 - 力扣&#xff08;LeetCode&#xf…...

(C题|社交媒体平台用户分析问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...

计网_PPP协议

2024.10.15&#xff1a;beokayy计算机网络学习笔记 PPP协议 PPP协议的特点PPP协议应满足的需求&#xff08;了解&#xff09;PPP协议的组成&#xff08;PPP协议有三个组成部分&#xff09; PPP协议的帧格式PPP协议的工作状态 ISP指的是运营商&#xff0c;比如中国联通、中国电信…...

Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

二叉树删除结点详细代码

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h>typedef int data_t; typedef struct _node {data_t data;struct _node* left;struct _node* right; }node_t;int bst_create(node_t**, data_t);//函数声明BST创建 int bst…...

PyTorch线性代数操作详解:点积、矩阵乘法、范数与轴求和

本文通过代码示例详细讲解PyTorch中常用的线性代数操作&#xff0c;包括点积、矩阵乘法、范数计算以及按轴求和等操作&#xff0c;帮助读者掌握张量运算的核心方法。 1. 点积运算 点积&#xff08;Dot Product&#xff09;是两个向量对应元素相乘后求和的结果。 实现代码&…...

Java SE(6)——类和对象

1.初始面向对象 1.1 什么是面向对象 Java是一门纯面向对象的编程语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交换来完成一件事情 1.2 面向过程…...

Kubernetes(k8s)的API Server 组件原理与结合生产实战教程

一、API Server 架构深度解析 1. 核心架构设计 二、生产环境安全加固实战 1. 认证&#xff08;Authentication&#xff09; 2. 授权&#xff08;Authorization&#xff09; 3. 准入控制&#xff08;Admission Control&#xff09; 三、性能优化与调参 1. 关键启动参数 四…...

Java面试高频问题(31-33)

三十一、服务网格&#xff1a;东西向流量治理与故障注入 服务网格架构分层 mermaid graph BT subgraph Control Plane APilot --> BEnvoy Sidecar CMixer --> B DCitadel --> B end subgraph Data Plane B --> E服务A B --> F服务B B --> G服务C end 核心能…...

VSCode开发调试Python入门实践(Windows10)

我的Windows10上的python环境是免安装直接解压的Python3.8.x老版本&#xff0c;可参见《Windows下Python3.8环境快速安装部署。 1. 安装VSCode 在Windows 10系统上安装Visual Studio Code&#xff08;VS Code&#xff09;是一个简单的过程&#xff0c;以下是详细的安装方法与…...

C++——入门基础(2)

文章目录 一、前言二、C入门2.1 缺省参数2.2 函数重载2.2.1 参数类型不同2.2.1.1 整体参数类型不同2.2.1.2 参数类型顺序不同 2.2.2 参数个数不同2.2.3 避坑注意2.2.3.1无参与有参2.2.3.2 返回值不同 2.3 引用2.3.1 引用的概念2.3.2引用的结构2.3.3 引用的特点2.3.4引用的作用2…...

【MySQL】复合查询与内外连接

目录 一、复合查询 1、基本查询回顾&#xff1a; 2、多表查询&#xff1a; 3、自连接&#xff1a; 4、子查询&#xff1a; 单列子查询 多行子查询&#xff1a; 多列子查询&#xff1a; 在from语句中使用子查询&#xff1a; 5、合并查询&#xff1a; union&#xff1…...

第3篇:请求参数处理与数据校验

在 Web 开发中&#xff0c;请求参数处理与数据校验是保障系统稳定性的第一道防线。本文将深入探讨 Egg.js 框架中参数处理的完整解决方案&#xff0c;涵盖常规参数获取、高效校验方案、文件流处理等核心功能&#xff0c;并分享企业级项目中的最佳实践。 一、多场景参数获取策略…...

Android JIT编译:adb shell cmd package compile选项

Android JIT编译&#xff1a;adb shell cmd package compile选项 例如&#xff1a; adb shell cmd package compile -m speed -f --full 包名 配置参数指令说明&#xff1a; compile [-r COMPILATION_REASON] [-m COMPILER_FILTER] [-p PRIORITY] [-f] [--primary-dex] …...

排序算法——冒泡排序

一、介绍 「冒泡排序bubblesort」通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样&#xff0c;因此得名冒泡排序。 冒泡过程可以利用元素交换操作来模拟&#xff1a;从数组最左端开始向右遍历&#xff0c;依次比较相邻元素大小&#xff0c;如果“左…...

文献阅读篇#5:5月一区好文阅读,BFA-YOLO,用于建筑信息建模!(上)

期刊简介&#xff1a;《Advanced Engineering Informatics》创刊于2002年&#xff0c;由Elsevier Ltd出版商出版&#xff0c;出版周期Quarterly。该刊已被SCIE数据库收录&#xff0c;在中科院最新升级版分区表中&#xff0c;该刊分区信息为大类学科工程技术1区&#xff0c;2023…...

工行手机银行安全吗?在应用商店下载工商银行安全吗?

现在很多的人都会用手机银行&#xff0c;其中工行的使用几率也是比较高的&#xff0c;但大家在使用的过程中就会比较关心使用工行手机银行是否安全。如果直接在应用商店下载&#xff0c;是否有安全保障&#xff1f; 工行的手机银行会拥有较高的保障&#xff0c;从技术到服务都可…...

python如何word转pdf

在Python中&#xff0c;将Word文档&#xff08;.docx或.doc&#xff09;转换为PDF可以通过多种库实现。以下是几种常见的方法及详细步骤&#xff1a; 方法1&#xff1a;使用 python-docx comtypes&#xff08;仅Windows&#xff0c;需安装Word&#xff09; 适用于Windows系统…...

在阿里云 Ubuntu 24.04 上部署 RabbitMQ:一篇实战指南

前言 RabbitMQ 是业界常用的开源消息中间件,支持 AMQP 协议,易于部署、高可用、插件丰富。本文以阿里云 ECS 上运行的 Ubuntu 24.04 LTS 为例,手把手带你完成 RabbitMQ 从仓库配置到运行的全流程,并分享在国内环境下常见的坑与对应解决方案。 环境概况 操作系统:Ubuntu …...

Linux Shell 重定向与管道符号(>, >>, |)的实现机制

文章目录 Linux Shell 重定向与管道符号&#xff08;>, >>, |&#xff09;的实现机制一、重定向基础&#xff1a;dup2() 的核心作用二、输出重定向的实现原理>&#xff08;覆盖重定向&#xff09;>>&#xff08;追加重定向&#xff09; 三、| 管道符的实现原…...

GitHub 趋势日报 (2025年04月30日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1686⭐ 54925Python2Qwe…...

计算机操作系统知识集合

主要来自小林coding 硬件结构 cpu位宽 如果用 32 位 CPU 去加和两个 64 位大小的数字&#xff0c;就需要把这 2 个 64 位的数字分成 2 个低位 32 位数字和 2 个高位 32 位数字来计算&#xff0c;先加个两个低位的 32 位数字&#xff0c;算出进位&#xff0c;然后加和两个高位…...

PostgreSQL数据类型

数据类型 数值类型 整数类型 SMALLINT 小范围整数&#xff0c;取值范围&#xff1a;-32768 ~ 32767 INT&#xff08;INTEGER&#xff09; 普通大小整数&#xff0c;取值范围&#xff1a;-2147483648 ~ 2147483647 浮点数类型 REAL 6位十进制数字精度 NUMERIC(m, n) 任意精度…...

在Linux中,KVM和Docker在Linux虚拟化中的区别是什么?

KVM&#xff08;Kernel-based Virtual Machine&#xff09;和Docker是Linux环境中两种不同的虚拟化技术&#xff0c;它们在实现原理、资源隔离程度、应用场景等方面存在显著区别&#xff1a; 实现原理与技术层级 KVM&#xff1a;KVM是一种基于硬件辅助虚拟化的全虚拟化技术&a…...

【docker学习笔记】如何删除镜像启动默认命令

一些镜像会在它打镜像时&#xff0c;加入一些默认的启动命令&#xff0c;可以通过docker inspect \<image id\>来查看Entrypoint。如下图&#xff0c;docker run启动时&#xff0c;会默认执行 "python3 -m vllm.entrypoints.openai.api_server" 如果不想执行&…...

c语言 39.0625转为16进制

c语言 39.0625转为16进制 寄存器的4&#xff5e;15对应整数部分 39为整数部分 39 &#xff08;10进制&#xff09; 0x27&#xff08;16进制&#xff09; 寄存器的0&#xff5e;3对应小数部分 0.0625为小数部分 0.0626 1/16 则0&#xff5e;3位十六进制值应为 0x1 39.06250…...

【阿里云大模型高级工程师ACP习题集】2.8 部署模型

习题集: 以下关于直接调用模型(无需部署)的说法,错误的是?【单选题】 A. 无需部署模型,只需简单调用API B. 按token量计费,无需担心模型部署的资源消耗 C. 可随意调用,没有任何限制 D. 适合业务初期或中小规模场景 使用vLLM部署模型时,若出现端口被占用的情况,以下做…...

【进阶】--函数栈帧的创建和销毁详解

目录 一.函数栈帧的概念 二.理解函数栈帧能让我们解决什么问题 三.相关寄存器和汇编指令知识点补充 四.函数栈帧的创建和销毁 4.1.调用堆栈 4.2.函数栈帧的创建 4.3 函数栈帧的销毁 一.函数栈帧的概念 --在C语言中&#xff0c;函数栈帧是指在函数调用过程中&#xff0c;…...

猫,为什么是猫?

英语单词 cat&#xff0c;意为猫&#xff1a; cat n.猫 根据首字母象形原则&#xff0c;通常我们喜欢将首字母C&#xff0c;解释为猫爪&#xff0c;C的形象&#xff0c;通常可解释为字母K的右侧的中间凹陷部分&#xff0c;K | <&#xff0c;也就是 C 和 < 相通&#…...

数字智慧方案6169丨智慧医院后勤管理解决方案(58页PPT)(文末有下载方式)

资料解读&#xff1a;智慧医院后勤管理解决方案 详细资料请看本解读文章的最后内容。 在当今万物互联的时代&#xff0c;传统医院后勤管理模式逐渐暴露出诸多弊端&#xff0c;已难以适应医院集团化发展的需求。这份智慧医院后勤管理解决方案资料&#xff0c;深入剖析了传统管理…...

经济学和奥地利学派的起源

&#xff08;一&#xff09;经济学和奥地利学派的起源&#xff1a; 早期思想&#xff1a; 亚当斯密被认为是现代经济学的鼻祖&#xff0c;但早期的亚里士多德、柏拉图以及中国的《管子》等著作也包含经济学思想&#xff0c;但更偏向财政学。 亚当斯密之前的学者&#xff1a; 坎…...

Linux安全清理删除目录bash脚本

直接写清除目录命令可能会因为一时手抖导致删除重要目录 rm -rf是个危险的命令&#xff0c;我写了bash脚本&#xff0c;放在环境变量目录下可以当系统命令来用 这里是单线程的&#xff0c;如果需要更高的性能&#xff0c;需要加入多线程的支持。 1.实现功能 清理目录的子内容…...

C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 17)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 二…...

Lucene并不是只有倒排索引一种数据结构,支持多种数据结构

Lucene 的核心机制确实以**倒排索引&#xff08;Inverted Index&#xff09;**为核心&#xff0c;但它并不是“全部”都依赖倒排索引。Lucene 的索引结构中还包含其他辅助数据结构&#xff0c;用于支持不同的查询场景。以下是详细的解释&#xff1a; 1. 核心机制&#xff1a;倒…...

使用Docker一键安装SigLens:简单快捷的日志分析解决方案

在当今复杂的IT环境中,高效的日志管理和分析变得越来越重要。SigLens作为一款强大的开源日志分析工具,为开发者和运维人员提供了直观、高效的日志处理体验。本文将介绍如何使用Docker快速安装SigLens,让您在几分钟内就能开始进行日志分析。 为什么选择Docker安装SigLens? Do…...

【Linux】线程池和线程补充内容

个人主页~ 线程池 一、线程池简介单例模式线程池简介 二、单例模式线程池的实现1、ThreadPool.hpp2、Task.hpp3、main.cpp 三、其他常见锁读写锁 一、线程池简介 池化技术我们并不陌生&#xff0c;我们在前面的文章中实现过进程池&#xff0c;这里线程池的作用也是先申请资源交…...

vue3内置组件Suspense的使用

Suspense 实验性功能<Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异…...

怪物猎人:世界-冰原10000+mod整合包5月最新更新!

700A大全套精美服装 800M大全套精美服装 3月31日更新 新增 新武器 新特效MOD 当前共计5800MOD整合包 好看的发型mod 实用的功能mod 炫酷的武器mod 新服装新特效新武器实用模组美化&#xff0c;等。 1月14日更新 新增皮肤MOD 500 当前共计2000MOD 1月16日更新 新增超…...

题解:洛谷 CF2091E Interesting Ratio

思路推导 我们先对 32 32 32 和 96 96 96 进行二进制拆分。 相同部分&#xff08;用 α \alpha α 表示&#xff09;&#xff1a; 5 5 5 个 2 2 2。 不同部分&#xff08;用 β \beta β 表示&#xff09;&#xff1a; 1 1 1 和 3 3 3。 gcd ⁡ ( 32 , 96 ) \gcd(32,9…...