Android的Activity生命周期知识点总结,详情
一. Activity生命周期
1.1 返回栈知识点
二. Activity状态
2.1 启动状态
2.2 运行状态
2.3 暂停状态
2.4 停止状态
2.5 销毁状态
三. Activity生存期
3.1 回调方法
3.2 生存期
四. 体验Activity的生命周期
五. Activity被回收办法
引言:
掌握Activity的生命周期对Android开发来说非常重要,当我们深入理解Activity的生命周期之后,就可以写出更加连贯流畅的理序,并在如何合理管理应用资源方面发挥得游刃有余。我们的应用程序也将会拥有更好的用户体验。
一.Activity生命周期
1.1返回栈:
我们知道,Android里的Activity可以层叠的,我们每启动一个新的Activity,就会覆盖在原来的Activity之上,然后点击Back按键,会销毁最上面的Activity,下面的一个Activity就会显示出来。
其实Android是使用任务(task)来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作返回栈(back stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个Activity时,处于栈顶的Activity就会出栈,前一个入栈的Activity就会重新处于栈顶的位置。
系统总是会显示处于栈顶的Activity给用户。
图1:返回栈流程图
1.2 Activity状态
Activity有主要的四个状态,以及一个非常迅速的启动状态,下面我们来讲解他们的功能:
1.2.1启动状态(Starting):
启动状态就是内个非常迅速的状态,在Activity启动时会自动跳转到下一个状态,这也就是为什么很多的Activity介绍里只写了四个状态而没有介绍这个状态了。
1.2.2运行状态(Running):
当一个Activity位于返回栈的栈顶时,Activity就处于运行状态。系统最不愿意回收的就是处于运行状态的Activity,因为这会带来非常差的运行体验。
1.2.3暂停状态(Paused):
当一个Activity不再处于栈顶的位置,但仍然可见时,Activity就进入了暂停状态。你可能会觉得,既然Activity已经不在栈顶了,怎么会可见呢?这是因为并不是每一个Activity都会占满整个屏幕,比如对话框式的Activity只会占用中间屏幕的部分区域。处于暂停状态的Activity仍然是完全存活的,系统也不愿意回收这种Activity(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只有在内存极低的情况下,系统才会去考虑回收这种Activity。
1.2.4停止状态(Stopped):
当一个Activity 不再处于栈顶位置,并且完全不可见的时候,就进人了停止状态。系统仍然会为这种Activity保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的Activity有可能会被系统回收。
1.2.5销毁状态(Destroyed):
一个Activity 从返回栈中移除后就变成了销毁状态。系统最倾向于回收处于这种状态的Activity以保证手机的内存充足。
1.3生存期
1.3.1回调方法
在Activity类中定义了7个回调方法,其覆盖了Activity生命周期的每一个环节,下面我们来一个一个看这 些方法:
1.onCreate()——创建
这个方法我们已经看到过很多次了,在每个Activity 中都重写了这个方法,它会在Activity第一次被创建的时候调用。我们应该在这个方法中完成Activity的初始化操作,比如加载布局、绑定事件等。
2.onStart()——启动
这个方法在Activity由不可见变为可见的时候调用
3.onResume()——恢复
这个方法在Activity准备好和用户进行交互的时候调用。此时的Activity一定位于返回栈的栈顶,并且处于运行状态。
4.onPause()——停顿
这个方法在系统准备去启动或者恢复另一个Activity的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶Activity的使用。
5.onStop()——暂停
这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的Activity,那么onPause()方法会得到执行,而onstop()方法并不会执行。
6.onDestory()——销毁
这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。
7.onRestart——重启
这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了。
1.3.2生存期
1.3.2.1完整生存期
完整生存期:Activity在onCreate()方法和onDestroy()方法之间所经历的就是完整生存期。一般情况下, 一个Activity会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操 作。
1.3.2.2可见生存期
Activity在onStart()方法和onStop()方法之间所经历的就是可见生存期。在可见生存期内,Activity对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。比如在onStart()方法中,对资源进行加载,而onStop()方法中对资源进行释放,从而保证处于停止状态的Activity不会占用过多内存。
1.3.2.3前台生存期
Activity在onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内, Actvity总是处于运行状态,此时的 Activity 是可以和用户进行交互的,我们平时看到和接触最多的就是这个状态下的Activity。
图3.Activity生命周期
1.4体验Activity的生命周期
了解了Activity的生命周期之后,我们来写一个实例,通过实例来详细了解。
首先,我们新建一个EmptyActivity,名为NormalActivity,其布局起名为normal_layout;使用相同的方法创建DialogActivity,布局起名为dialog_layout。
接下来,我们先编辑normal_layout.xml文件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_ parent"
android:layout_height="match_ parent">
<Textview
android:Layout_width="match_parent"
android:layout_height="wrap_content
android:text="This is a normal activity"
/>
</LinearLayout>
在这里我们简单的定义了一个TextView,显示了一行文字"This is a normal activity"。
接着我们编辑dialog_layout.xml文件,代码如下:
<LinearLayout xmlns:android-"http://schemas.android.com/apk/res/android
android:orientation"vertical"
android: Layout_width="match_parent"
android: layout_height="match_parent">
<Textview
android:layout_width="match_parent"
android: layout_height="wrap_content"
android:text="This is a dialog activity"
/>
</LinearLayout>
接下来我们修改AndroidManifest.xml的标签配件。
这里注册了两个Activity,此时我们为什么使用了一个android:theme的属性?这里是给前面的Activity指定主题,这里的"@style/Animation.Design.BottomSheetDialog"则毫无疑问是让DialogActivity使用对话框的主题。现在,我们可以修改activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/startNormalActivity"
android:text="Start NormalActivity"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/startDialogActivity"
android:text="Start DialogActivity"/>
</LinearLayout>
这里我们添加两个按钮,一个用于启动NormalActivity,一个用于启动DialogActivity,修改代码:
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
findViewById(R.id.startNormalActivity).setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
NormalActivity.class);
startActivity(intent);
}
});
findViewById(R.id.startDialogActivity).setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
DialogActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
}
现在,我们启动程序,并看一下logcat的效果。
图4:Main界面图
此时我们不对界面做任何操作,看log cat运行过程:
图5:MainLogCat打印日志
这里其实我们就会发现,在MainActivity第一次被创建时会依次执行onCreate,onStart和onResume方法。
然后点击第一个按钮NormalActivity,打开normal_layout界面:
图6:NormalActivity界面
此时的Logcat打印日志:
图7:NormalActivity的LogCat打印日志
由于此时NormalActivity已经把MainActivity完全遮挡住,所以onPause和onStop都会执行。然后按下Back按键返回MainActivity。
这时候我们返回原来的界面,再看log cat打印日志:
图8:返回MainActivity时的打印日志
由于之前的MainActivity已经进入了停止状态,所以onRestart方法会得到执行,之后会依次执行
onRestart和onResume方法,此时onCreate方法不会执行,因为MainActivity并没有重新创建。
点击第二个按钮,启动DialogActivity。
此时的logcat:
图9:打开DialogActivity界面
可以看到,只有onPause的方法得到了执行,onStop没有得到执行,这是因为DialogActivity并没有完全遮挡住MainActivity,此时MainActivity只是进入暂停状态,并没有进入停止状态。
最后在MainActivity按下Back按键,退出程序,打印程序:
图10:结束界面
1.5Activity被回收办法
前面讲过,当一个Activity进入了停止状态,是有可能被系统回收的。我们可以假设一种情况:有一个ActivityA,我们在这个基础上启动了ActivityB,这时候A任务就陷入停止状态,这个时候由于系统的内存不足,系统将ActivityA回收掉了,然后用户按下Back按键返回ActivityA,正常情况下还是会显示ActivityA,这是并不会执行onRestart方法,而是会执行onCreate方法,因为A在这种情况下被重新创建一次。
但是偶尔我们还是回遇见一种情况,如果在A中可能会存在临时数据和状态,比如说A里有一个文本输入框,我们输入了一段数据;拿上面内个程序举例,此时我们打开了NormalActivity,这时MainActivity由于内存不足被回收掉,此时我们如果点击Back返回;此时如果内存不足的话,刚刚输入的文字就都没了,因为MainActivity被重建了。
这种情况是非常影响用户体验的,这时Activity里有一种回调方法我们就可以使用了——onSaveInstanceState(),这个方法可以保证在Activity被回收之前一定会被调用。
omSaveInstanceState()方法携带一个Bundle类的参数,Bundle提供一系列的方法用于保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据,以此类推。每个保存方法需传入两个参数,第一个参数是键,用于后面的Bundle中取值,第二个参数是真正要保存到内容。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
数据已经保存下来了,那么我们在哪里恢复呢?我们一直使用的onCreate方法其实也有一个Bundle类型的参数。这个参数在一般情况下都是null。但是如果在Activity被系统回收之前,我们通过 onSaveInstanceState方法保存数据,这个参数就会带有之前的保存的数据,我们只需要通过相应的取值方法将数据去除,修改代码如下:
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
public class MyActivity extends AppCompatActivity {
private static final String TAG = "MyActivity"; // 确保你有一个合适的TAG
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, "tempData is " + tempData);
}
}
}
取出值之后再做相应的恢复操作就可以了。
我们会发现在使用Bundle保存和取出数据的时候和使用Intent传递 也有类似的方法。这里Intent还可以结合Bundle一起用于传递数据。
首先我们可以把传递的数据都保存在Bundle对象中,然后再将Bundle对象存放在Intent里,到了目标的Activity之后,先从Intent中取出Bundle,再从Bundle中一一取出数据。
注:另外,当手机的屏幕旋转的时候,Activity也会有一个重建的过程,所以这时候,数据也可能发生丢失的情况。
相关文章:
Android的Activity生命周期知识点总结,详情
一. Activity生命周期 1.1 返回栈知识点 二. Activity状态 2.1 启动状态 2.2 运行状态 2.3 暂停状态 2.4 停止状态 2.5 销毁状态 三. Activity生存期 3.1 回调方法 3.2 生存期 四. 体验Activity的生命周期 五. Activity被回收办法 引言: 掌握Acti…...
STM32——HAL库开发笔记19(串口中断接收实验)(参考来源:b站铁头山羊)
本实验,我们以中断的方式使得串口发送数据控制LED的闪烁速度,发送1,慢闪;发送2,速度正常;发送3,快闪。 一、电路连接图 二、实现思路&CubeMx配置 1、实现控制LED的闪烁速度 uint32_t bli…...
基于腾讯云TI-ONE 训练平台快速部署和体验 DeepSeek 系列模型
引言 在前两篇文章中,我们通过腾讯云的HAI部署了DeepSeek-R1,并基于此进行了一系列实践。 腾讯云HAI DeepSeek 腾讯云AI代码助手 :零门槛打造AI代码审计环境 基于腾讯云HAI DeepSeek 快速开发中医辅助问诊系统 这些尝试不仅帮助我们理解…...
python的类装饰器
装饰器不仅可以用于函数,还能作用于类。将装饰器应用于类时,其核心原理与作用于函数类似,都是通过接收一个类作为输入,然后返回一个新的类或者修改后的原类,以此来为类添加额外的功能 简单的类装饰器 def add_method…...
C++17中的LegacyContiguousIterator(连续迭代器)
文章目录 特点内存连续性与指针的兼容性更高的性能 适用场景与C接口交互高性能计算 支持连续迭代器的容器示例代码性能优势缓存局部性指针算术优化 注意事项总结 在C17标准里,LegacyContiguousIterator(连续迭代器)是一类特殊的迭代器。它不仅…...
Linux-文件IO
1.open函数 【1】基本概念和使用 #include <fcntl.h> int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 f…...
DeepSeek-R1 + Cherry Studio 本地部署打造个人 AI 知识库
ChatGPT 爆火的时候,我心里就燃起了一个想法:打造一个专属于自己的AI知识库,它就像我的第二大脑一样,能记住我生活里的点点滴滴。 我随口一问“去年5月我做了什么”,它不仅能精准找到记录,还能帮我回忆起那…...
《红色警戒:兵临城下》 游戏软件安装步骤与百度网盘链接
软件简介: 《红色警戒:兵临城下》(Command & Conquer: Red Alert)是一款经典的即时战略游戏,由Westwood Studios开发,于1996年首次发行。它是《命令与征服》系列的衍生作品,以其独特的世界…...
25/2/16 <算法笔记> DirectPose
DirectPose 是一种直接从图像中预测物体的 6DoF(位姿:6 Degrees of Freedom)姿态 的方法,包括平移和平面旋转。它在目标检测、机器人视觉、增强现实(AR)和自动驾驶等领域中具有广泛应用。相比于传统的位姿估…...
第32周:文献阅读
目录 摘要 Abstract 文献阅读 问题引入 研究问题 研究意义 研究方法 集成方法 随机森林(RF) 支持向量机(SVM) 简单循环神经网络(SimpleRNN) 长短期记忆网络(LSTM) 创…...
Ollama 开发指南
文章来源:开发指南 - Ollama中文文档|Ollama官方文档 安装先决条件: GOC/C 编译器,例如 macOS 上的 Clang、TDM-GCC (Windows amd64) 或 llvm-mingw (Windows arm64)、Linux 上的 GCC/Clang。…...
【deepseek与chatGPT辩论】辩论题: “人工智能是否应当具备自主决策能力?”
探讨辩论题 这个提案涉及创建一个精确的辩论题目,旨在测试deepseek的应答能力。 创建辩论题目 提议设计一个辩论题目以测试deepseek的应答能力。希望这个题目具有挑战性并能够测量其回应质量。 好的,来一道适合深度学习的辩论题: 辩论题&…...
神经网络常见激活函数 9-CELU函数
文章目录 CELU函数导函数函数和导函数图像优缺点pytorch中的CELU函数tensorflow 中的CELU函数 CELU 连续可微指数线性单元:CELU(Continuously Differentiable Exponential Linear Unit),是一种连续可导的激活函数,结合了 ELU 和 …...
JavaScript系列(74)--反射API详解
JavaScript反射API详解 🔍 JavaScript的反射API提供了强大的运行时检查和操作对象的能力。本文将深入探讨Reflect API的原理、应用场景和最佳实践。 反射基础 🌟 💡 小知识:反射是指程序在运行时能够检查、修改自身结构和行为的…...
轻量级分组加密算法RECTANGLE
轻量级分组加密算法RECTANGLE RECTANGLE轻量级分组密码算法是Wentao Zhang,Zhenzhen Bao,Dongdai Lin等学者于2014年提出的,该算法是SPN结构的,采用了线性移位的置换层以及44bit的S盒。RECTANGLE是一个迭代分组密码,分组长度为64…...
智能设备监控:AI 与 Python 助力设备管理的未来
智能设备监控:AI 与 Python 助力设备管理的未来 引言 随着物联网(IoT)和智能设备的广泛应用,我们的日常生活逐渐离不开这些高科技产品。从智能家居到工业控制,智能设备已经渗透到各个领域。然而,随着设备种类和数量的增加,如何高效地监控这些设备,确保它们的稳定性和…...
python语言进阶之函数
目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…...
Golang Model 字段自动化校验设计
背景 在我们日常开发中,不可避免的总要去进行各种参数校验,但是如果在某个场景中,要校验的字段非常多,并且在其中还有耦合关系,那么我们手写校验逻辑就变得非常的低效且难以维护。本篇文档就基于 DDD 领域模型设计的思…...
Hot100 堆
215. 数组中的第K个最大元素 - 力扣(LeetCode) 堆排序 我们可以借助一个小顶堆来维护当前堆内元素的最小值,同时保证堆的大小为 k: 遍历数组将元素入堆; 如果当前堆内元素超过 k 了,我们就把堆顶元素去除…...
AIGC图生视频保姆级教程
一、AI文生图高阶技巧 推荐工具 ▸ MidJourney(艺术感最强) ▸ DALLE 3(与ChatGPT深度联动) ▸ Leonardo.ai(精细化参数控制) 核心策略 提示词架构: [主体描述][环境氛围][镜头语言][风格参数…...
Qt QDateTimeEdit总结
1. 概述 QDateTimeEdit 是 Qt 提供的用于编辑日期和时间的控件,支持直接输入或通过弹出日历/时间选择器调整值。继承自 QAbstractSpinBox,是 QDateEdit 和 QTimeEdit 的父类,可同时处理日期和时间。默认显示格式为系统本地化的日期时间格式&…...
【吾爱出品】 视频批量分段工具
视频批量分段工具 链接:https://pan.xunlei.com/s/VOJDvtHQE7GOiJ84WNea5Ay1A1?pwd5nta# 选择视频文件 启动程序后,点击 "文件" 菜单下的 "选择视频文件" 按钮,或者直接将视频文件拖放到程序窗口中的视频列表区域。支…...
SHEIN的迁移与无奈
日前,因杭州宇树科技、DeepSeek的“六小龙”企业崛起,不少地方开始反思,为什么本地没有留住创始人,或者发展出类似的企业。例如DeepSeek创始人梁文锋和Kimi创始人杨植麟都是广东人,但都在其他地区创业成功。而还有媒体…...
TCP/UDP 简介,三次握手与四次挥手
一、TCP 三次握手 目的:为了解决在不可靠的信道上建立可靠的网络连接 三次握手是连接请求的过程: A 发送连接请求的数据给 B(发送 SYN 包) B 同意连接,返回数据给 A(返回 SYNACK 包) A 收到后回…...
Windows Defender Control--禁用Windows安全中心
Windows Defender Control--禁用Windows安全中心 链接:https://pan.xunlei.com/s/VOJDuy2ZEqswU4sEgf12JthZA1?pwdtre6#...
数据仓库与数据湖的协同工作:智慧数据管理的双引擎
数据仓库与数据湖的协同工作:智慧数据管理的双引擎 引言 在数据驱动的今天,企业和组织收集和存储的数据量正以惊人的速度增长。如何高效管理和利用这些数据,成为了决策者和技术专家的共同难题。为了解决这一问题,数据仓库(Data Warehouse)和数据湖(Data Lake)这两种技…...
50. c++多维数组
在‘19 数组’中描述了原生数组的本质和其索引的原理,一维数组是连续的一个内存块,本质就是指针,指向这个内存块的起始位置,索引的原理就是对该指针的操作。通常对数组的操作一种策略就是使用指针,二维数组可以说是数组…...
用大模型学大模型05-线性回归
deepseek.com:多元线性回归的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点,及如何改进解决及改进方法数据推…...
苹果CMS站群插件的自动生成功能:提升网站流量的秘诀
引言 在数字营销的浪潮中,站群技术因其强大的流量引导能力而备受青睐。苹果CMS作为一款优秀的内容管理系统,凭借其灵活性和可扩展性,成为了站群管理的理想选择。本文将详细介绍苹果CMS站群插件的自动生成功能,探讨如何通过这一功…...
大语言模型中one-hot编码和embedding之间的区别?
1. 维度与稀疏性 One-Hot编码 定义:每个词被表示为一个高维稀疏向量,维度等于词汇表大小。例如,词汇表有10,000个词,每个词对应一个10,000维的向量,其中仅有一个位置为1(表示当前词)࿰…...
【Bluedroid】 BLE连接源码分析(一)
BLE链接过程分析见【Bluedroid】BLE连接过程详解-CSDN博客,本篇主要围绕HCI_LE_Create_Connection展开。基于Android14源码进行分析。在蓝牙低功耗技术中,设备之间建立连接是进行数据传输等操作的前提。HCI LE Extended Create Connection Command 提供了一种更灵活、功能更丰…...
【C语言】移除元素
移除元素 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后…...
SQL与数据库程序设计
1.1986年,10月美国国家标准局颁布了SQL语言的美国标准,称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…...
基于Java企业项目管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Blazor-设置组件焦点
在Razor中设置焦点我们需要用到ElementReference类型的变量,使用ref指令引用到设置焦点HTML的元素。 在Blazor中,ElementReference类型的作用是提供对HTML DOM元素的引用,以便在C#代码中通过JavaScript互操作(JS Interopÿ…...
信用违约掉期(Credit Default Swap, CDS):金融市场的“保险”还是“定时炸弹”?(中英双语)
信用违约掉期(CDS):金融市场的“保险”还是“定时炸弹”? 引言 信用违约掉期(Credit Default Swap, CDS) 是金融市场中一种重要的衍生品,它最初被设计为债务违约的保险工具,但在实…...
Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力
摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案,涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例,展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...
核货宝多语言订货系统:打破语言障碍,拓展全球市场
在经济全球化的大背景下,企业的业务版图不断向全球扩张,国际贸易活动日益频繁。对于众多从事跨境贸易、跨国批发零售以及拥有广泛海外客户群体的企业而言,一款能够跨越语言障碍的多语言订货系统,已成为其在全球市场竞争中脱颖而出…...
【prompt示例】智能客服+智能质检业务模版
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权&am…...
在linux系统中安装Anaconda,并使用conda
系统 : ubuntu20.04 显卡:NVIDIA GTX1650 目录 安装Anaconda第一步:下载合适版本的Anconda1. 查看自己Linux的操作系统及架构命令:uname -a2. 下载合适版本的Anconda 第二步:安装Aanconda1. 为.sh文件设置权限2. 执行.sh文件2.1 .…...
基于 openEuler 构建 LVS-DR 群集
1、环境准备 准备好下面四台台服务器: 主机名IP角色openEuler-1192.168.121.11Director ServeropenEuler-2192.168.121.12Real Server1openEuler-3192.168.121.13Real Server2Rocky8192.168.121.51Client 2、Web服务器配置 在两台RS上安装并配置nginx服务&#…...
委托构造函数与继承构造函数
委托构造函数 允许同一类中的构造函数调用另一个构造函数,以复用初始化逻辑。 委托构造函数不能同时初始化成员变量,只能委托给其他构造函数。 避免循环委托(如构造函数A委托给B,B又委托给A)。 class MyClass { pu…...
EPLAN 自定义图框
一 , 还是先打开系统自带的图框,作为参考 二, 自定义图框 1. 新建图框 2. 绘制。下图描述有误,直接将系统默认图框文件复制,然后重命名,在这个基础上来进行编辑。 三, 使用 1. 更改默认图框 2…...
c++ gcc工具链
GCC(GNU Compiler Collection)是一套广泛使用的开源编译工具链,支持多种编程语言(如 C、C、Objective-C、Fortran 等),主要用于 Linux 和嵌入式开发环境。 组成 GCC 工具链主要由以下几个核心工具组成&am…...
基于51单片机的的鸡笼补光和恒温系统的设计与实现(源程序+Protues仿真+电路图+元件清单+器件手册)
编号:71 基于51单片机的的鸡笼补光和恒温系统的设计与实现 功能描述: 本设计由89C52单片机液晶12864显示模块声光报警电路温湿度传感器电路风扇电路LED照明电路光照检测电路GSM电路DS1302时钟电路 1.实现的功能 (1)采用DHT11温湿传感器、光敏电阻捕捉…...
es-head 正则查询和标准正则查询的差异
在es-head里面查询,需要查询字符串是一个json串,因此就要符合json串的格式,在es-head里面可以通过regexp做正则查询,而这里的正则表达式其实是写成字符串的形式的,因此就要面对字符串转义的问题,比如你想匹…...
【深度学习】深度学习和强化学习算法——深度 Q 网络DQN
深度 Q 网络(Deep Q-Network, DQN) 详解 什么是DQNDQN 的背景DQN 训练流程 2 DQN 的核心思想2.1 经验回放(Experience Replay)2.2 目标网络(Target Network)2.3 ε-贪心策略(ε-Greedy Policy&a…...
matlab模拟风场的随机脉动风
1、内容简介 matlab137-模拟风场的随机脉动风 可以交流、咨询、答疑 2、内容说明 略 模拟风场的随机脉动风,并进行相关的统计分析和计算,包括风速谱、空间相关性、自谱、互谱、以及POD(Proper Orthogonal Decomposition)分解等…...
2025年2月16日(numpy-deepseek)
嗯,用户让我介绍一下这段使用numpy的代码。首先,我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学,所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np,这应该是导入numpy库,并…...
x64和ARM的区别
x64和ARM是两种不同的处理器架构,它们在指令集、设计理念、应用场景和能耗效率等方面存在显著差异。以下是它们之间的主要区别: 1. **指令集架构**: * **x64**:x64架构,也称为x86-64或AMD64,是x86架…...