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

Android开发之生命周期(App、Activity)

在Android开发中,应用程序(App)和活动(Activity)的生命周期是非常重要的概念。它们各自都有一系列的生命周期方法,这些方法会在特定的时刻被系统自动调用,以便于开发者对应用或活动进行相应的操作。下面将详细探讨Android应用程序和活动的生命周期。

一、应用程序(App)生命周期

应用程序的生命周期从它被加载到内存开始,直到它完全从内存中卸载。这个生命周期可以被划分为以下几个阶段:

1. 启动阶段

当用户首次启动应用时,onCreate()方法被调用,这是整个生命周期的开始。在这个方法中,开发者可以完成应用的初始化工作,如加载数据、创建视图等。

2. 运行阶段

应用正在前台运行,用户与它进行交互。在这个阶段,onResume()方法被调用。在这个方法中,开发者可以恢复应用的状态,确保用户在离开应用后再次打开时能够继续之前的工作。

3. 暂停和停止阶段

当有其他应用或屏幕处于前台时,当前应用进入暂停或停止状态。这时会调用onPause()onStop()方法。在这个阶段,开发者可以保存应用的状态或者释放一些不必要占用的资源。

4. 重新启动阶段

当用户再次点击应用图标或从后台重新启动应用时,onRestart()方法被调用。在这个方法中,开发者可以重新初始化一些资源或者重新加载数据。

5. 销毁阶段

当应用不再需要运行并且要从内存中卸载时,onDestroy()方法被调用。在这个方法中,开发者可以释放所有占用的资源,确保应用完全退出。

示例代码

public class MyApplication extends Application {  @Override  public void onCreate() {  super.onCreate();  // 初始化应用程序的代码  Log.d("MyApplication", "onCreate() is called.");  }  @Override  public void onStart() {  super.onStart();  // 启动应用程序的代码  Log.d("MyApplication", "onStart() is called.");  }  @Override  public void onResume() {  super.onResume();  // 恢复应用程序的代码  Log.d("MyApplication", "onResume() is called.");  }  @Override  public void onPause() {  super.onPause();  // 暂停应用程序的代码  Log.d("MyApplication", "onPause() is called.");  }  @Override  public void onStop() {  super.onStop();  // 停止应用程序的代码  Log.d("MyApplication", "onStop() is called.");  }  @Override  public void onDestroy() {  super.onDestroy();  // 销毁应用程序的代码  Log.d("MyApplication", "onDestroy() is called.");  }  
}

二、活动(Activity)生命周期

每个 Activity 都有自己的生命周期,Activity 的生命周期与 App 的生命周期是相互独立的。

Activity的生命周期与用户界面相关,它代表了一个特定的屏幕或界面。Activity的生命周期也分为几个关键阶段:

在这里插入图片描述

1. 创建阶段

当新的活动实例首次被创建时,onCreate()方法被调用。这是初始化视图、数据和其他资源的好时机。开发者可以在这个方法中设置布局、初始化组件等。

2. 开始阶段

在活动首次变得可见时,onStart()方法被调用。在这个方法中,开发者可以执行一些准备工作,例如检查权限等。

3. 运行阶段

活动在前台运行并与用户交互。这是onResume()方法被调用的时刻。在这个方法中,开发者可以恢复界面状态、处理用户输入等。

4. 暂停和停止阶段

当有其他活动或屏幕覆盖当前活动时,onPause()onStop()方法被调用。在这个阶段,开发者可以保存界面状态或者释放一些不必要占用的资源。

5. 重新启动和恢复阶段

当用户返回到这个活动时,onRestart()onResume()方法会被再次调用。在这个方法中,开发者可以重新加载数据或者恢复界面状态。

6. 销毁阶段

当活动不再需要并且要被销毁时,onDestroy()方法被调用。在这个方法中,开发者可以释放所有占用的资源,确保活动完全退出。

示例代码

public class MyActivity extends AppCompatActivity {  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  // 初始化 Activity 的各种资源Log.d("MyActivity", "onCreate() is called.");  }  @Override  protected void onStart() {  super.onStart();  // 做一些 Activity 启动时需要做的事情,例如加载数据等Log.d("MyActivity", "onStart() is called.");  }  @Override  protected void onResume() {  super.onResume();  // 做一些 Activity 运行时需要做的事情,例如更新 UI 等Log.d("MyActivity", "onResume() is called.");  }  @Override  protected void onPause() {  super.onPause();  // 做一些 Activity 暂停时需要做的事情,例如停止更新 UI 等Log.d("MyActivity", "onPause() is called.");  }  @Override  protected void onStop() {  super.onStop();  // 做一些 Activity 停止时需要做的事情,例如释放资源等Log.d("MyActivity", "onStop() is called.");  }  @Override  protected void onDestroy() {  super.onDestroy();  // 做一些 Activity 销毁时需要做的事情,例如清除数据等Log.d("MyActivity", "onDestroy() is called.");  }  
}

注意

  • 在 Activity 的生命周期中,onCreate 方法只会调用一次,其他方法可能会被调用多次。
  • 在 Activity 的生命周期中,onPause 方法和 onStop 方法可能会被调用多次,但它们的顺序是固定的:onPause 方法会在 onStop 方法之前调用。
  • 在 Activity 的生命周期中,onDestroy 方法只会在 Activity 被销毁时调用一次。

三 在 Activity 之间导航

在应用的生命周期中,应用很可能会多次进入和退出 Activity。例如,用户可以点按设备的返回按钮,或者 Activity 可能需要启动不同的 Activity。本部分介绍了实现成功的 Activity 转换需要了解的主题。这些主题包括从另一个 Activity 启动 Activity、保存 Activity 状态,以及恢复 Activity 状态。

从一个 Activity 启动另一个 Activity
Activity 通常需要在某个时刻启动另一个 Activity。例如,当应用需要从当前屏幕移动到新屏幕时,就会出现这种需求。

根据您的 Activity 是否希望从即将启动的新 Activity 中获取返回结果,您可以使用 startActivity()startActivityForResult() 方法启动新 Activity。这两种方法都需要传入一个 Intent 对象。

Intent 对象指定您要启动的具体 Activity,或描述您要执行的操作类型(系统为您选择相应的 Activity,该 Activity 甚至可以来自不同应用)。Intent 对象还可以携带由已启动的 Activity 使用的少量数据。

startActivity()

如果新启动的 Activity 不需要返回结果,当前 Activity 可以通过调用 startActivity() 方法来启动它。

在自己的应用中工作时,您通常只需启动已知 Activity。例如,以下代码段显示如何启动一个名为 SignInActivity 的 Activity。

Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

您的应用可能还希望使用 Activity 中的数据执行某些操作,例如发送电子邮件、短信或状态更新。在这种情况下,您的应用自身可能不具有执行此类操作所需的 Activity,因此您可以改为利用设备上其他应用提供的 Activity 为您执行这些操作。这便是 intent 的真正价值所在。您可以创建一个 intent,对您想执行的操作进行描述,系统会从其他应用启动相应的 Activity。如果有多个 Activity 可以处理 intent,用户可以选择要使用哪一个。例如,如果您想允许用户发送电子邮件,可以创建以下 intent:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);

添加到 intent 中的 EXTRA_EMAIL extra 是一个字符串数组,其中包含电子邮件的收件人电子邮件地址。当电子邮件应用响应此 intent 时,该应用会读取 extra 中提供的字符串数组,并将该数组放入电子邮件撰写表单的“收件人”字段。在这种情况下,电子邮件应用的 Activity 会启动,并且当用户完成操作时,您的 Activity 会继续运行。

startActivityForResult()

有时,您会希望在 Activity 结束时从 Activity 中获取返回结果。例如,您可以启动一项 Activity,让用户在联系人列表中选择收件人;当 Activity 结束时,系统将返回用户选择的收件人。为此,您可以调用 startActivityForResult(Intent, int) 方法,其中整数参数会标识该调用。此标识符用于消除来自同一 Activity 的多次 startActivityForResult(Intent, int) 调用之间的歧义。这不是全局标识符,不存在与其他应用或 Activity 冲突的风险。结果通过 onActivityResult(int, int, Intent) 方法返回。

当子级 Activity 退出时,它可以调用 setResult(int) 将数据返回到其父级。子级 Activity 必须始终提供结果代码,该结果代码可以是标准结果 RESULT_CANCELEDRESULT_OK,也可以是从 RESULT_FIRST_USER 开始的任何自定义值。此外,子级 Activity 可以根据需要返回包含它所需的任何其他数据的 Intent 对象。父级 Activity 使用 onActivityResult(int, int, Intent) 方法,以及父级 Activity 最初提供的整数标识符来接收信息。

如果子级 Activity 由于任何原因(例如崩溃)而失败,父级 Activity 将收到代码为 RESULT_CANCELED 的结果。

public class MyActivity extends Activity {// ...static final int PICK_CONTACT_REQUEST = 0;public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {// When the user center presses, let them pick a contact.startActivityForResult(new Intent(Intent.ACTION_PICK,new Uri("content://contacts")),PICK_CONTACT_REQUEST);return true;}return false;}protected void onActivityResult(int requestCode, int resultCode,Intent data) {if (requestCode == PICK_CONTACT_REQUEST) {if (resultCode == RESULT_OK) {// A contact was picked.  Here we will just display it// to the user.startActivity(new Intent(Intent.ACTION_VIEW, data));}}}}

协调 Activity

当一个 Activity 启动另一个 Activity 时,它们都会经历生命周期转换。第一个 Activity 停止运行并进入“已暂停”或“已停止”状态,同时创建另一个 Activity。如果这些 Activity 共享保存到磁盘或其他位置的数据,必须要明确第一个 Activity 在创建第二个 Activity 之前并未完全停止。相反,启动第二个 Activity 的过程与停止第一个 Activity 的过程重叠。

生命周期回调的顺序已有明确定义,特别是当两个 Activity 在同一个进程(应用)中,并且其中一个要启动另一个时。以下是 Activity A 启动 Activity B 时的操作发生顺序:

  • Activity A 的 onPause() 方法执行。
  • Activity B 的 onCreate()onStart()onResume() 方法依次执行(Activity B 现在具有用户焦点)。
  • 然后,如果 Activity A 在屏幕上不再显示,其 onStop() 方法执行。

您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转换。

总结

应用程序(App)和活动(Activity)的生命周期是Android开发中的重要概念。了解这些生命周期方法可以帮助开发者更好地管理资源、优化性能并提高用户体验。通过合理地使用这些生命周期方法,开发者可以确保应用或活动在各种情况下都能够稳定、流畅地运行。在开发过程中,遵循这些生命周期方法是至关重要的,以确保应用的稳定性和性能。

参考

  • Android 开发者文档 - 了解 Activity 生命周期
  • 使用生命周期感知型组件处理生命周期
  • Android 官方示例代码
  • Android 官方培训课程

相关文章:

Android开发之生命周期(App、Activity)

在Android开发中,应用程序(App)和活动(Activity)的生命周期是非常重要的概念。它们各自都有一系列的生命周期方法,这些方法会在特定的时刻被系统自动调用,以便于开发者对应用或活动进行相应的操…...

利用html2Canvas将表格下载为html

给到我的需求是点击按钮时请求后端接口,根据后端返回的数据,生成表格,并将表格的内容直接下载为html,如下图。 平常做的下载都是后端返回二进制流,这次前端做下载那就必须把页面先画出来,因为下载下来的表格在页面上是不显示的&a…...

《Git快速入门》Git分支

1.master、origin、origin/master 区别 首先搞懂git分支的一些名称区别: master : Git 的默认分支名字。它并不是一个特殊分支、跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它&#xff0c…...

HarmonyOS应用性能与功耗云测试

性能测试 性能测试主要验证HarmonyOS应用在华为真机设备上运行的性能问题,包括启动时长、界面显示、CPU占用和内存占用。具体性能测试项的详细说明请参考性能测试标准。 性能测试支持Phone和TV设备,包格式包括Hap/App。 前提条件 已注册华为开发者帐号&a…...

【AI】人工智能本地环境集成安装

目录 1、基础安装 1.1 GPU安装 1.1.1 GPU版本支持 1.1.2 下载CUDA 1.1.3安装CUDA 1.1.4配置环境变量 1.1.5检测CUDA是否安装成功 1.2 CUDNN安装 1.2.1 下载CUDNN 1.2.2 添加配置 1.2.3验证结果 2、pytorch安装...

主流级显卡的新选择,Sparkle(撼与科技)Intel Arc A750兽人体验分享

▼前言 对于玩家而言,英特尔独显的出现不仅打破了NVIDIA与AMD双雄天下的局面,而且旗下的Arc A系列显卡还拥有不俗的做工性能以及颇具优势的价格,无论是升级或者是装新机都非常合适。如果要在Arc A系列当中选一个性能不俗,能够满足…...

BI 商业数据分析能够给企业带来什么改变?

时下,随着中国企业数据整合应用的意识不断提高,BI 商业数据分析的应用驶入飞速发展的“快车道”。BI 商业智能利用数据分析技术与业务场景联系起来,通过一系列思维方法、指标体系及工具模型来支持市场分析、产品优化、客户洞察,从…...

模式识别与机器学习-特征选择和提取

模式识别与机器学习-特征选择和提取 特征选择一些距离测度公式独立特征的选择准则一般特征的散布矩阵准则 离散K-L变换 谨以此博客作为复习期间的记录。 常见分类问题的流程,数据预处理和特征选择提取时机器学习环节中最重要的两个流程。这两个环节直接决定了最终性…...

嵌入式——RTC闹钟Alarm

开发流程 配置RTC时钟设置RTC闹钟配置RTC闹钟中断实现中断函数RTC闹钟初始化 // 闹钟外部中断 exti_flag_clear(EXTI_17); exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);// 重置闹钟 rtc_alarm_disable(RTC_ALARM0);rtc_alarm_struct ras; ras.alarm_mask = RTC_ALARM…...

【linux】线程控制

线程控制 1.创建线程2.线程终止3.线程等待4.线程分离5.对线程的简单封装 喜欢的点赞,收藏,关注一下把! 进程概念上篇文章已经讲完了,下面我们就来说说线程控制。 我们使用的接口是pthread线程库,也叫做原生线程库给我…...

Swift学习笔记第三节:Set类型

1、代码 import Foundationvar set1: Set<Int> [1, 2, 3, 4, 3] print("定义1: \(set1)") var set2 Set(1...4) print("定义2: \(set2)") print("长度: \(set2.count)") print("是否为空: \(set2.isEmpty)") set1.insert(99)…...

【前端】安装指定版本的nodejs

先安装curl sudo apt install curl以下是 Nodejs 18.x的安装&#xff0c;一行代码搞定 &&\ 的意思是前面的命令执行无误后&#xff0c;再执行后面代码 curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\ sudo apt-get install -y node…...

多商户小程序开源商城源码 打造微信商城新零售网店

一款易于二次开发的商城小程序&#xff0c;使用php、thinkphp6、vue、element-ui和uniapp技术栈进行开发。 该商城小程序内置多商户商城和分销商城&#xff0c;包括小程序商城、H5商城、公众号商城、PC商城和App&#xff0c; 支持多种分销模式、拼团、砍价、秒杀、优惠券、活…...

云仓酒庄的品牌雷盛红酒LEESON分享干红是纯葡萄酿造的吗?

干红是一种葡萄酒的简称&#xff0c;全称是干型红葡萄酒。葡萄酒按含残糖量分为干型、半干型、半甜型和甜型。无论什么型的酒&#xff0c;只要是葡萄酒&#xff0c;那就是葡萄酿造的。 云仓酒庄的品牌雷盛红酒LEESON分享干红是葡萄酒的一种&#xff0c;而葡萄酒却不止干红一种…...

PHP函数学习总结

version_compare&#xff08;比较php版本&#xff09; 用法&#xff1a; version_compare(string $version1, string $version2, ?string $operator null): int|bool//示例 $result version_compare(PHP_VERSION, 8.0.0) > 0 ? ok : fail;echo $result;// 输出ok证明当…...

5G RedCap:轻量5G技术的新宠

嘿&#xff0c;大家好&#xff01;今天我们将深入了解一项引领5G轻量化时代的关键技术——5G RedCap。这项技术可谓是5G发展中的一把新利器&#xff0c;让我们看看它是如何在5G世界中展露头角的。 5G RedCap是什么&#xff1f;轻量化5G技术的精髓 5G RedCap的全名是5G Reduced…...

【LeetCode 热题 HOT 100】题解笔记 —— Day04

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…...

rust中的超时处理

rust中的超时处理 自从 tokio 1.0发布以来&#xff0c;rust的异步开发总算大势已定。尽管没达到标准库的速度&#xff0c;依然挡不住大家的热情。看编程排行榜&#xff0c;增加2倍的开发者。 既生瑜何生亮&#xff0c;感觉go就是小号的rust。 不废话了。背景&#xff1a;之前…...

DML语言(重点)———update

格式&#xff1a;update 要修改的对象 set 原来的值新值 -- 修改学员名字,带了简介 代码案例&#xff1a; -- 修改学员名字,带了简介 UPDATE student SET name清宸 WHERE id 1; -- 不指定条件情况下&#xff0c;会改动所有表&#xff01; 代码案例…...

Mybatis使用详解

简介 MyBatis是一款优秀的持久层框架&#xff0c;它支持普通SQL查询&#xff0c;存储过程和高级映射。MyBatis通过简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的POJOs&#xff08;Plain Ordinary Java Object&#xff0c;普通的Java对象&#xff09;映射成数据…...

云原生周刊:Karmada 成为 CNCF 孵化项目 | 2023.12.25

开源项目推荐 kubernetes-reflector Reflector 是一个 Kubernetes 的插件&#xff0c;旨在监视资源&#xff08;secrets 和 configmaps&#xff09;的变化&#xff0c;并将这些变化反映到同一命名空间或其他命名空间中的镜像资源中。 Lingo Lingo 是适用于 K8s 的 OpenAI 兼…...

【开源】基于JAVA的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…...

Java基于TCP网络编程的群聊功能

服务端 import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server2 {public static List<Socket> onlineList new ArrayList<>();public static void main(String[] args) throws Except…...

CentOS+ISCSI

九、配置iSCSI 添加1块大小为10G的虚拟硬盘; 安装iSCSI服务端targetcli; 使用新增加的硬盘创建卷组,名称为iscsivg,再创建iSCSI共享逻辑卷,逻辑 卷名称为iscsistore,大小为5G; 使用上述逻辑卷创建后端存储,名称为serverc.iscsistore; 定义iSCSI的IQN为iqn.2022-…...

RHCE9学习指南 第11章 网络配置

11.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP&#xff0c;子网掩码&#xff0c;网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制&#xff0c;例如&#xff0c; 11000000 10101000 00…...

Qt如何在控制台项目中使用opencv打开视频

Qt如何在控制台项目中使用opencv打开视频&#xff1f; 重要代码&#xff1a; 1、在pro文件中这样设置&#xff1a; QT - gui QT core widgets serialport 2、不要继承和使用&#xff1a;QCoreApplication #include pro文件&#xff1a; cpp QT - gui QT core widgets seria…...

Node.js 默认包管理器 npm 详解

目录 npm 概念 npm 命令 npm init npm install npm update npm uninstall npm search npm run other npm 安装 yarn npm 安装 yarn 和 npm 安装项目依赖 websocket 本质区别 npm 概念 npm&#xff08;Node Package Manager&#xff09;是一个用于管理 JavaScript 包…...

vue利用深拷贝解决修改不能取消的问题

vue利用深拷贝解决修改不能取消的问题 在对某数据进行修改时考虑还需要进行“确认”、“取消”操作&#xff0c;那么在取消时就需要返回保留的数据内容&#xff0c;那么如何将原有数据保留一份则是关键性问题。 显然修改值不能直接进行原值的赋值操作&#xff0c;因为这样无法取…...

MATLAB - 使用 YOLO 和基于 PCA 的目标检测,对 UR5e 的半结构化智能垃圾箱拣选进行 Gazebo 仿真

系列文章目录 前言 本示例展示了在 Gazebo 中使用 Universal Robots UR5e cobot 模拟智能垃圾桶拣选的详细工作流程。本示例提供的 MATLAB 项目包括初始化、数据生成、感知、运动规划和积分器模块&#xff08;项目文件夹&#xff09;&#xff0c;可创建完整的垃圾桶拣选工作流…...

个性化定制的知识付费小程序,为用户提供个性化的知识服务,知识付费saas租户平台

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…...

基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts

介绍 基于flask和echarts的新冠疫情实时监控系统 软件架构 后端基于python的flask框架&#xff0c;前端主要是echarts 安装教程 下载到本地&#xff0c;在python相应环境下运行app.py,flask项目部署请自行完成 使用说明 flaskProject文件夹中 app.py是flask项目主运行文…...

总结js中遍历对象属性的方法

方法介绍 1、 forin循环&#xff1a;遍历对象自身的和原型链上的可枚举属性。 2、Object.getOwnPropertySymbols()方法&#xff1a;返回一个数组&#xff0c;包含对象自身的所有Symbol类型的属性。 3、 Object.getOwnPropertyNames()方法&#xff1a;返回一个数组&#xff0…...

编写fastapi接口服务

FastAPI是一个基于 Python 的后端框架&#xff0c;该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制&#xff0c;使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1&#xff1a;安装必要库 pip install fastapi uvicorn st…...

RasaGPT对话系统的工作原理

RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目&#xff0c;当超出 Rasa 现有意图(out_of_scope)的时候&#xff0c;就会执行 ActionGPTFallback&#xff0c;本质上就是利用 Langchain 做了一个 RAG&#xff0c;调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂&#xff0c…...

C++设计模式 #7 工厂方法(Factory Method)

“对象创建”模式 通过“对象创建”模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持创建的稳定。它是接口抽象之后的第一步工作。 动机 在软件系统中&#xff0c;经常面临着创…...

信息网络协议基础-接入网技术

文章目录 概述***基于ATM架构虚电路PVC和SVC信元格式为什么信元格式由AAL决定?网络架构传统电信网络:点对点链路PPP协议协议内容消息过程多协议封装功能电话网接入Internet(DSL 数字用户线路)主要接入技术ADSL关键技术DMTDSLAM体系结构PPPOE帧格式过程特点局域网定义参考模型L…...

springboot 自动装配原理

在理解springboot自动装配之前需要了解spring的Configuration原理和Conditional两个注解原理。可以看下以前写的这两篇文章 spring 源码阅读之Configuration解析 spring使用Conditional进行条件装配 spring的SPI机制之使用SpringFactoriesLoader加载服务实现 SpringBootApp…...

前端---表格标签

1. 表格的结构 表格是由行和列组成&#xff0c;好比一个excel文件 2. 表格标签 <table>标签&#xff1a;表示一个表格 <tr>标签&#xff1a;表示表格中的一行 <td>标签&#xff1a;表示表格中的列<th>标签&#xff1a;表示表格中的表头 示例代码: &l…...

【软件工程】可执行文件和数据分离

一、概述 可执行文件和数据分离是一种软件设计策略&#xff0c;旨在将程序代码和程序使用的数据分离存储。这种方法通常用于提高软件的模块化程度和灵活性&#xff0c;以及方便软件的管理和维护。 在可执行文件和数据分离中&#xff0c;程序代码通常以可执行文件的形式存储&a…...

Linux dirs命令

Linux dirs命令用于显示目录记录。 显示目录堆叠中的记录。 语法 dirs [/-n -l]参数&#xff1a; n 显示从左边算起第n笔的目录。-n 显示从右边算起第n笔的目录。-l 显示目录完整的记录。 实例 列出"/home/cc/Ruijie"里所有内容的详细信息。可用如下命令。 dir…...

有什么好用的C/C++源代码混淆工具?

​ 有什么好用的C/C源代码混淆工具&#xff1f; 开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护&#xff0c;防止应用…...

iOS设备信息详解

文章目录 ID 体系iOS设备信息详解IDFA介绍特点IDFA新政前世今生获取方式 IDFV介绍获取方式 UUID介绍特点获取方式 UDID介绍获取方式 OpenUDID介绍 Bundle ID介绍分类其他 IP地址介绍获取方式 MAC地址介绍获取方式正常获取MAC地址获取对应Wi-Fi的MAC地址 系统版本获取方式 设备型…...

如何使用支付宝沙箱环境支付并公网调用sdk创建支付单服务

文章目录 1.测试环境2.本地配置2. 内网穿透2.1 下载安装cpolar内网穿透2.2 创建隧道3. 测试公网访问4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名5. 使用固定二级子域名进行访问 1.测试环境 MavenSpring bootJdk 1.8 2.本地配置 获取支付宝支付Java SDK,…...

[EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 Dell Latitude-7400 处理器Intel Core i7-8665U已驱动内存16GB DDR4 RAM已驱动硬盘Toshiba KIOXIA 512GB SSD已驱动显卡Intel UHD 620 Graphics已驱动声卡Realtek ALC256已驱动有线网卡 无 无无线网卡蓝牙Intel Wireless-AC 9560已驱动 支持系统版本 maco…...

用芯片SIC8833可开发电子秤方案

SIC8833作为一款高性能的电子秤方案芯片&#xff0c;这款芯片是一个带24bitADC的8位RISC MCU&#xff0c;内置8k16位OTP程序存储器。具体24位双向I/O口的特性&#xff0c;广泛应用于电子衡器和精密测量及控制系统&#xff0c;能满足用户的不同需求和应用场景。 以下是电子秤方案…...

【Qt-QFile-QDir】

Qt编程指南 ■ Stream■ QTextStream■ QDataStream ■ QDial■ QDir■ QFile■■ ■ Stream ■ QTextStream /* 获取文件的路径 */ QString fileName QFileDialog::getOpenFileName(this);/* 指向文件 */ file.setFileName(fileName);/* 判断文件是否存在 */ if (!file.exi…...

设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点

系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式&#xff0c;5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;每一种模式的概念、使用…...

Android 13 - Media框架(25)- OMXNodeInstance(二)

上一节我们了解了 OMXNodeInstance 的创建过程&#xff0c;以及 IOmx 服务和 OMXNodeInstance、OMX组件之间的联系。接下来我们将一起了解 ACodec 是如何通过 OMXNodeInstance 这个中间层进行端口定义设置&#xff0c;以及端口Buffer分配的。 OMXNodeInstance 的代码还是比较长…...

生物系统学中的进化树构建和分析R工具包V.PhyloMaker2的介绍和详细使用

V.PhyloMaker2是一个R语言的工具包&#xff0c;专门用于构建和分析生物系统学中的进化树&#xff08;也称为系统发育树或phylogenetic tree&#xff09;。以下是对V.PhyloMaker2的一些基本介绍和使用说明&#xff1a; 论文介绍&#xff1a;V.PhyloMaker2: An updated and enla…...

XStream 反序列化漏洞 CVE-2021-39144 已亲自复现

XStream 反序列化漏洞 CVE-2021-39144 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建 修复建议总结 漏洞名称 漏洞描述 在Unmarshalling Time处包含用于重新创建前一对象的类型信息。XStream基于这些类型的信息创建新实例。攻击者可以控制输入流并替换或注入对象&am…...