Android广播机制

简介

        某个网络的IP范围是192.168.0.XXX,子网 掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知,Android也引入了一套类似的广播消息机制。这是因为Android中的每个应用程序都可以对自己感 兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自 于系统的,也可能是来自于其他应用程序的。Android提供了一套完整的API,允许应用程序自 由地发送和接收广播。发送广播的方法其实之前稍微提到过,如果你记性好的话可能还会有印 象,就是借助我们第2章学过的Intent。而接收广播的方法则需要引入一个新的概念——广播接 收器(Broadcast Receiver)。广播接收器的具体用法将会在下一节中做介绍,这里我们先来了解一下广播的类型。Android中 的广播主要可以分为两种类型:标准广播有序广播

一、广播的方式

标准广播:

        标准广播 (Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播 接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。 这种广播的效率会比较高,但同时也意味着它是无法被截断的。标准广播的工作流程如图所示。

有序广播:

        有序广播 (Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只 会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广 播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以 先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接 收器就无法收到广播消息了。有序广播的工作流程如图所示。

二、动态注册监听网络变化

        Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统 的状态信息。比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时 间或时区发生改变也会发出一条广播,等等。如果想要接收到这些广播,就需要使用广播接收 器,下面我们就来看一下它的具体用法。广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收 器就能够收到该广播,并在内部处理相应的逻辑。注册广播的方式一般有两种,在代码中注册(动态注册) 和在AndroidManifest.xml中注册(静态注册)。

三、动态注册

1.定义NetworkChangeReceived监听网络状态变化
第一种代码逻辑:

public class NetworkChangeReceived extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {boolean isConnected = isNetworkConnected(context);String statusMessage = isConnected ? "连接" : "断开";String networkType = NetworkType(context);Toast.makeText(context, "网络已" + statusMessage + ",类型" + networkType, Toast.LENGTH_SHORT).show();}}private boolean isNetworkConnected(Context context) {ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo activeNetwork = cm.getActiveNetworkInfo();return activeNetwork != null && activeNetwork.isConnectedOrConnecting();}private String NetworkType(Context context) {ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo activeNetwork = cm.getActiveNetworkInfo();return activeNetwork != null ? activeNetwork.getTypeName() : "未知";}
}/*代码解释*/// 定义一个BroadcastReceiver子类,用于监听网络状态变化
public class NetworkChangeReceived extends BroadcastReceiver {// 当接收到广播时调用此方法@Overridepublic void onReceive(Context context, Intent intent) {// 检查Intent的动作是否为网络连接状态改变if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {// 调用私有方法检查网络是否连接boolean isConnected = isNetworkConnected(context);// 根据网络连接状态构建提示消息String statusMessage = isConnected ? "连接" : "断开";// 获取网络类型String networkType = NetworkType(context);// 使用Toast显示网络状态和类型Toast.makeText(context, "网络已" + statusMessage + ",类型" + networkType, Toast.LENGTH_SHORT).show();}}// 私有方法,用于检查网络是否处于连接状态private boolean isNetworkConnected(Context context) {// 获取系统的ConnectivityManager服务ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 获取当前活动的网络信息NetworkInfo activeNetwork = cm.getActiveNetworkInfo();// 判断网络信息是否非空并且网络正在连接或已经连接return activeNetwork != null && activeNetwork.isConnectedOrConnecting();}// 私有方法,用于获取网络类型private String NetworkType(Context context) {// 获取系统的ConnectivityManager服务ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 获取当前活动的网络信息NetworkInfo activeNetwork = cm.getActiveNetworkInfo();// 如果网络信息非空,返回网络类型名;否则返回"未知"return activeNetwork != null ? activeNetwork.getTypeName() : "未知";}
}
第二种代码逻辑:

public class NetworkChangeReceived extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {Toast.makeText(context,checkNetworkConnectionAndGetType(context), Toast.LENGTH_SHORT).show();}}public static String checkNetworkConnectionAndGetType(Context context) {ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo info = cm.getActiveNetworkInfo();if (info != null && info.isConnectedOrConnecting()) {// 网络已连接,返回网络类型名称return "连接"+info.getTypeName();} else {// 未连接网络return "断开";}}
}/*代码解释*//*** NetworkChangeReceived 类,继承自 BroadcastReceiver,用于监听和响应网络状态变化的广播事件。*/
public class NetworkChangeReceived extends BroadcastReceiver {/*** 当接收到广播时调用此方法。* * @param context 上下文,提供了应用程序的环境信息。* @param intent Intent 对象,包含了广播的数据和动作。*/@Overridepublic void onReceive(Context context, Intent intent) {/*** 检查 Intent 的动作是否是网络状态改变的广播。* 如果是,则获取网络状态和类型的信息,并通过 Toast 显示给用户。*/if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {Toast.makeText(context, checkNetworkConnectionAndGetType(context), Toast.LENGTH_SHORT).show();}}/*** 检查当前设备的网络连接状态,并返回连接状态和网络类型。* * @param context 上下文,提供了应用程序的环境信息。* @return 返回一个字符串,描述了当前网络的连接状态和类型。*/public static String checkNetworkConnectionAndGetType(Context context) {// 从系统服务中获取 ConnectivityManager 实例,用于管理网络连接。ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 获取当前活动的网络信息。NetworkInfo info = cm.getActiveNetworkInfo();if (info != null && info.isConnectedOrConnecting()) {// 如果网络已连接,返回网络类型名称,并且前面加上"连接"两个字。return "连接" + info.getTypeName();} else {// 如果网络未连接,返回"断开"。return "断开";}}
}
2.Mainactivity中应用NetworkChangeReceived

public class MainActivity extends AppCompatActivity {private NetworkChangeReceived networkChangeReceived;private static final int PERMISSION_REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_NETWORK_STATE)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_NETWORK_STATE}, PERMISSION_REQUEST_CODE);}else {registerReceiver();}}@Overridepublic void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == PERMISSION_REQUEST_CODE){if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {registerReceiver();}else {Toast.makeText(this, "没有网络权限,无法检测网络状态", Toast.LENGTH_SHORT).show();}}}private void registerReceiver(){networkChangeReceived = new NetworkChangeReceived();IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(networkChangeReceived,filter);}@Overrideprotected void onDestroy() {super.onDestroy();if (networkChangeReceived != null) {unregisterReceiver(networkChangeReceived);}}
}/*代码解释*//*** MainActivity 类,继承自 AppCompatActivity,是应用的主要活动入口点。*/
public class MainActivity extends AppCompatActivity {// 声明一个 NetworkChangeReceived 对象,用于接收网络状态变化的广播。private NetworkChangeReceived networkChangeReceived;// 定义一个常量,用于请求权限时的请求码。private static final int PERMISSION_REQUEST_CODE = 1;/*** 在 Activity 创建时调用。* * @param savedInstanceState 可能包含先前实例状态的 Bundle 对象。*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this); // 这里假设 EdgeToEdge 是一个库的方法,用于设置全屏边缘到边缘的界面。setContentView(R.layout.activity_main); // 设置 Activity 的布局资源。// 检查是否已有访问网络状态的权限。if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {// 请求访问网络状态的权限。ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_NETWORK_STATE}, PERMISSION_REQUEST_CODE);} else {// 如果已经有权限,则注册网络状态变化的广播接收器。registerReceiver();}}/*** 当权限请求的结果返回时调用。* * @param requestCode 请求码,用于识别哪个权限请求的回调。* @param permissions 请求的权限数组。* @param grantResults 权限请求的结果数组。*/@Overridepublic void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 如果权限被授予,注册网络状态变化的广播接收器。registerReceiver();} else {// 如果权限被拒绝,显示一个 Toast 提示用户。Toast.makeText(this, "没有网络权限,无法检测网络状态", Toast.LENGTH_SHORT).show();}}}/*** 注册网络状态变化的广播接收器。*/private void registerReceiver() {networkChangeReceived = new NetworkChangeReceived();IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(networkChangeReceived, filter);}/*** 在 Activity 销毁时调用。*/@Overrideprotected void onDestroy() {super.onDestroy();if (networkChangeReceived != null) {// 在 Activity 销毁前,取消注册网络状态变化的广播接收器。unregisterReceiver(networkChangeReceived);}}
}

四、静态注册实现开机启动

        动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存 在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写 在onCreate() 方法中的。这里我们准备让程序接收一条开机广播,当收到这条广播时就可以在onReceive() 方法里执 行相应的逻辑,从而实现开机启动的功能。可以使用Android Studio提供的快捷方式来创建一个 广播接收器,右击com.example.broadcasttest包→New→Other→Broadcast Receiver。

创建广播接收器的窗口

Exported 属性表示是否允许 这个广播接收器接收本程序以外的广播,Enabled 属性表示是否启用这个广播接收器。勾选这 两个属性,点击Finish完成创建。

自动新建一个类,并继承BroadcastReceiver

public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "My Receiver", Toast.LENGTH_LONG).show();}
}

五、AndroidManifest.xml文件中注册

        静态的广播接收器一定要在AndroidManifest.xml文件中注册才可以使用,不过由于我们是 使用Android Studio的快捷方式创建的广播接收器,因此注册这一步已经被自动完成了。打开 AndroidManifest.xml文件瞧一瞧,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"tools:targetApi="31"><receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest><!-- 代码解释 --><?xml version="1.0" encoding="utf-8"?>
<!-- 指定文档的版本和编码方式 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><!-- 声明命名空间,定义了 Android 和工具属性的前缀 --><!-- 声明应用需要的权限 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 允许应用访问网络状态 --><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><!-- 允许应用接收设备启动完成的广播 --><applicationandroid:allowBackup="true"<!-- 应用的数据是否允许被备份 -->android:dataExtractionRules="@xml/data_extraction_rules"<!-- 数据提取规则,定义哪些数据可以被提取 -->android:fullBackupContent="@xml/backup_rules"<!-- 完整备份内容规则,定义哪些数据应该包含在完整备份中 -->android:icon="@mipmap/ic_launcher"<!-- 应用图标资源的引用 -->android:label="@string/app_name"<!-- 应用的显示名称 -->android:roundIcon="@mipmap/ic_launcher_round"<!-- 圆形应用图标资源的引用,适用于圆形图标显示的场景 -->android:supportsRtl="true"<!-- 是否支持从右到左的语言布局方向 -->android:theme="@style/Theme.MyApplication"<!-- 应用主题的样式引用 -->tools:targetApi="31"><!-- 工具属性,指定应用的目标 API 级别 --><!-- 定义一个广播接收器 --><receiverandroid:name=".MyReceiver"android:enabled="true"<!-- 是否启用该接收器 -->android:exported="true"><!-- 是否允许其他应用发送广播到该接收器 --><intent-filter><!-- 定义接收器能够接收的广播类型 --><action android:name="android.intent.action.BOOT_COMPLETED"/><!-- 接收设备启动完成的广播 --></intent-filter></receiver><!-- 定义一个活动 --><activityandroid:name=".MainActivity"android:exported="true"><!-- 活动的类名和是否允许外部应用启动 --><intent-filter><!-- 定义活动能够响应的意图类型 --><action android:name="android.intent.action.MAIN" /><!-- 活动是应用的入口点 --><category android:name="android.intent.category.LAUNCHER" /><!-- 活动属于 Launcher 类别,意味着它会出现在应用启动器中 --></intent-filter></activity></application>
</manifest>

        由于Android系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED 的广播,因此我们在 标签里添加了相应的action。另外,监听系统开机广播 也是需要声明权限的,可以看到,我们使用 标签又加入了一 条android.permission.RECEIVE_BOOT_COMPLETED 权限。目前为止,我们在广播接收器的onReceive() 方法中都只是简单地使用Toast提示了一段文 本信息,当你真正在项目中使用到它的时候,就可以在里面编写自己的逻辑。需要注意的是, 不要在onReceive() 方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中 是不允许开启线程的,当onReceive() 方法运行了较长时间而没有结束时,程序就会报错。 因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者 启动一个服务等,

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

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

相关文章

游戏行业情报 | 手机玩3A终是空想?iOS版3A大作销量滑铁卢

2023年9月的苹果发布会上&#xff0c;苹果宣布iPhone15 Pro系列首发配备的A17 Pro芯片将能够支持3A游戏的游玩&#xff0c;随着该系列设备的发布&#xff0c;《生化危机 4》、《生化危机&#xff1a;村庄》、《死亡搁浅》和《刺客信条&#xff1a;幻景》等大作先后登陆iOS平台。…

Qt 使用 QZipReader 解压文件

Qt 使用 QZipReader 解压文件 文章目录 Qt 使用 QZipReader 解压文件摘要关于 QZipReader使用 QZipReader代码解释&#xff1a; 快速解 extractAll 关键字&#xff1a; Qt、 QZipReader、 extractAll、 Zip、 解压缩 摘要 每日一坑&#xff0c;坑坑难过&#xff0c;今日在…

2024年度 | 推荐PC端时间规划、项目管理软件(最新)

PingCode&#xff1a;适用于IT团队的项目/任务管理。 https://pingcode.com/ Worktile&#xff1a;团队通用的任务规划工具。 https://worktile.com/ Todoist&#xff1a;个人任务管理工具&#xff0c;支持跨平台同步。 Todoist | 管理您工作和生活的To Do List Pomodoro Ti…

Android选择题界面的设计——线性布局实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button、CheckBox等实现一个选择题界面&#xff0c;界面如图1所示。 图1 选择题界面效果图 任务分析 上述界面可以分解为上下两部分&#xff0c;上面部分可以使用横向的线性布局来完成&#xff0c;下面部分可以使用…

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势 随着全球互联网的迅猛发展和移动互联网的普及&#xff0c;广告投放已经成为企业扩大品牌影响力、获取潜在客户的重要手段之一。在印尼这一充满活力的市场中&#xff0c;直播工具APP的广告投放尤为关键。海外快…

快速了解 | 企业代码签名证书怎么弄

企业代码签名证书是用于签名软件、驱动程序、代码库等的数字证书&#xff0c;它能够保证软件的完整性和来源的真实性&#xff0c;从而提升用户对软件的信任度&#xff0c;消除电脑系统对于“未知发布者”软件的安装拦截和弹窗警告&#xff0c;消除微软的SmartScreen提醒。 1、…

ArmPiPro-多人同时开发

V0.0 2024.07.04 ROS节点间的通信是分布式的&#xff0c;也就是节点可以运行在不同的”主机“上&#xff0c;这些主机包括安装在机器人上的主控&#xff08;Pi4&#xff09;、通过串口连接PI4的烧写有Serialros的MCU从控、负责视觉开发的VM1、负责移动的VM2、负责机械臂的VM3都…

【自适应滤波系列四】回声消除(Acoustic Echo Cancellation, AEC)信号模型及其本质

什么是回声 关于回声的产生与传播,凌逆战(https://www.cnblogs.com/LXP-Never)大佬在其博客中阐述得很详细,可以去看他的博客,下面部分图片来源于其博客 回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。一些回声是必要的,比如剧院里的音乐回声…

海豚调度监控:新增依赖缺失巡检,上游改动再也不用担心了!

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益:) 用过 DolphinScheduler 的小伙伴应该都知道&#xff0c;Dolphin…

代理IP和VPN有什么区别?该怎么选择?

今天我们来聊聊很多人关心的一个问题——代理IP和VPN到底有什么区别&#xff1f;虽然它们听起来差不多&#xff0c;但其实有很大的不同。这篇文章&#xff0c;小编就带大家一起了解一下吧&#xff01; 什么是代理IP&#xff1f; 代理IP是一种通过代理服务器替换用户真实IP地址…

第3章.中央服务器的物联网模式--AI/ML集成

第3章.中央服务器的物联网模式 本章列出了由于存储和/或计算需求而部署在中央服务器上以及部署在边缘&#xff08;本地&#xff09;或云上的体系结构模式。 这些模式基于现场设备生成的数据提供见解&#xff0c;使用附加数据&#xff08;来自附加系统&#xff0c;如企业系统&am…

【数据结构】建堆的时间复杂度

一.向下调整建堆 1.二叉树层数与总节点个数关系 层数一定时&#xff0c;在二叉树节点个数最大的情况下&#xff0c;二叉树为满二叉树&#xff0c;如下图所示&#xff0c;可以清晰地看到在满二叉树中第h层有2^(h-1)个节点&#xff0c;总节点N就等于一个等比数列的求和&#xf…

6.基于SpringBoot的SSMP整合案例-业务层开发

目录 1.业务层标准开发 1.1接口定义 1.2实现类定义 1.3测试类定义 1.4小结&#xff1a; 2.业务层快速开发 2.1使用MyBatisP1us提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl),t> 接口定义&#xff1a; 实现类定义&#xff1a; 测试类&#xff1a; …

AI绘画Stable Diffusion 超高分辨率扩图教程:ControlNet组件-Tile妙用,增强细节保持构图完整!

大家好&#xff0c;我是向阳 今天给大家分享如何用AI绘画工具Stable Diffusion 的 ControlNet Tile工具应用。ControlNet Tile模型能够在SD绘图过程中&#xff0c;实现高分辨率下实现高清扩图&#xff0c;并且避免出现图像分身现象&#xff0c;以及可以调整SD扩散生产过程噪声…

Unity射击游戏开发教程:(29)躲避敌人的子弹射击

在这篇文章中,我将介绍如何创建一个可以使玩家火力无效的敌人。创建的行为如下...... 当玩家向敌人开火时,敌人会向左或向右移动。向左或向右的移动是随机选择的,并在一段时间后停止敌人的移动。如果敌人移出屏幕,它就会绕到另一边。将一个精灵拖到画布上,将其缩小以匹配游…

代码随想录-二叉搜索树①

目录 二叉搜索树的定义 700. 二叉搜索树中的搜索 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 98. 验证二叉搜索树 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 530. 二叉搜索树的最小绝对差 题目描述&#x…

Nature:使用语义熵检测大语言模型中的幻觉

使用语义熵检测大语言模型中的幻觉 Detecting hallucinations in large language models using semantic entropy 论文阅读摘要研究目标论文图表概述总结关键解决方案语义熵计算:虚构内容检测: 双向蕴涵在大语言模型中的应用上下文的重要性蕴涵估计器 实验设计语义熵计算步骤结…

文献解读-基准与方法研究-第十五期|《不同 DNA 测序平台的标准化比较》

关键词&#xff1a;基准与方法研究&#xff1b;基因测序&#xff1b;结构变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Standardized Comparison of Different DNA Sequencing Platforms标题&#xff08;中文&#xff09;&#xff1a;不同 DNA…

【规范】Git分支管理,看看我司是咋整的

前言 &#x1f34a;缘由 Git分支管理好&#xff0c;走到哪里都是宝 &#x1f3c0;事情起因&#xff1a; 最近翻看博客中小伙伴评论时&#xff0c;发现文章【规范】看看人家Git提交描述&#xff0c;那叫一个规矩一条回复&#xff1a; 本狗亲测在我司中使用规范的好处&#xf…

windows电脑如何使用计划任务定时重启电脑

下面是亲测可用。 1.windows设置-搜索控制面板-系统和安全-管理工具–计划任务 这时候开始创建计划任务了 1.创建基本任务 2.填写名称&#xff08;这里根据需要自己填写&#xff09; 2.触发器里选择&#xff1a;每日&#xff0c;下一步 3.修改时间&#xff0c;然后点击下…