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

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以保证手机的内存充足。

2 :状态关系图

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可见生存期

ActivityonStart()方法和onStop()方法之间所经历的就是可见生存期。在可见生存期内,Activity对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。比如在onStart()方法中,对资源进行加载,而onStop()方法中对资源进行释放,从而保证处于停止状态的Activity不会占用过多内存。

1.3.2.3前台生存期

ActivityonResume()方法和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 : name = ".DialogActivity"
               android : theme = "@style/Animation.Design.BottomSheetDialog" >
        </ activity >
< activity
               android : name = ".NormalActivity"
               android : exported = "false" />

这里注册了两个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的效果。

4Main界面图

此时我们不对界面做任何操作,看log cat运行过程:

图5:MainLogCat打印日志

这里其实我们就会发现,在MainActivity第一次被创建时会依次执行onCreateonStartonResume方法。

然后点击第一个按钮NormalActivity,打开normal_layout界面:

图6:NormalActivity界面

此时的Logcat打印日志:

图7:NormalActivity的LogCat打印日志

由于此时NormalActivity已经把MainActivity完全遮挡住,所以onPauseonStop都会执行。然后按下Back按键返回MainActivity

这时候我们返回原来的界面,再看log cat打印日志:

图8:返回MainActivity时的打印日志

由于之前的MainActivity已经进入了停止状态,所以onRestart方法会得到执行,之后会依次执行

onRestartonResume方法,此时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被回收办法 引言&#xff1a; 掌握Acti…...

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计&#xff0c;舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言&#xff1a;py…...

【Python爬虫(1)】专栏开篇:夯实Python基础

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

【油漆面积——线段树,扫描线,不用pushdown的特例,pushup兼有cal的性质】

题目 分析 不用pushdown是因为&#xff1a; 对于modify&#xff0c;操作是互逆过程&#xff0c;因此不会存在向下结算的pushdown过程 对于query&#xff0c;操作始终针对最上层的tr[1]&#xff0c;也不需要pushdown 对于pushdown&#xff0c;一则是怕不结算就标记&#xff0c;会…...

fps武器系统6:随机弹道

文章目录 设计随即弹道 思路连射时在一个范围内随机改变枪口旋转即可 实现改变枪口旋转改变旋转就是改变物体朝向即可随机&#xff1a;锥体随机 疑问旋转体与物体朝向(向量)间的关系为什么随即弹道调用两次 设计 随即弹道 思路 连射时在一个范围内随机改变枪口旋转即可 实现…...

深度学习(1)-简单神经网络示例

我们来看一个神经网络的具体实例&#xff1a;使用Python的Keras库来学习手写数字分类。在这个例子中&#xff0c;我们要解决的问题是&#xff0c;将手写数字的灰度图像&#xff08;28像素28像素&#xff09;划分到10个类别中&#xff08;从0到9&#xff09;​。我们将使用MNIST…...

硬件学习笔记--42 电磁兼容试验-6 传导差模电流干扰试验介绍

目录 电磁兼容试验-传导差模电流试验 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验-传导差模电流干扰试验 驻留时间是在规定频率下影响量施加的持续时间。被试设备&#xff08;EUT&#xff09;在经受扫频频带的电磁影响量或电磁干扰的情况下&#xff0c;在每个步进…...

Shader示例 6: 卡渲基础 - 描边 + 着色

0 、获取原神模型&#xff1a; 【游戏开发实战】下载原神模型&#xff0c;PMX转FBX&#xff0c;导入到Unity中&#xff0c;卡通渲染&#xff0c;绑定人形动画&#xff08;附Demo工程&#xff09;-CSDN博客 《原神》公测视频征集计划 一、描边pass&#xff1a;Outline 1. …...

Cherno C++ P55 宏

这篇文章我们讲一下C当中的宏。其实接触过大型项目的朋友可能都被诡异的宏折磨过。 宏是在预处理当中&#xff0c;通过文本替换的方式来实现一些操作&#xff0c;这样可以不用反复的输入代码&#xff0c;帮助我们实现自动化。至于预处理的过程&#xff0c;其实就是文本编辑&am…...

(20)从strlen到strtok:解码C语言字符函数的“生存指南1”

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;简单入手C语言专栏 目录 前言1. 求字符串长度函数1.1 strlen 2. 长度不受限制的字符串函数2.1 strcpy2.2 strcat2.3 strcmp 3. 长度受限制的字符串函数3.1 strncpy3.2 strncat3.3 strncmp 4. 字符串查找函数4.1 st…...

基于deepseek api和openweather 天气API实现Function Calling技术讲解

以下是一个结合DeepSeek API和OpenWeather API的完整Function Calling示例&#xff0c;包含意图识别、API调用和结果整合&#xff1a; import requests import json import os# 配置API密钥&#xff08;从环境变量获取&#xff09; DEEPSEEK_API_KEY os.getenv("DEEPSEE…...

Mongodb数据管理

Mongodb数据管理 1.登录数据库&#xff0c;查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库&#xff1a;admin 是 MongoDB 的管理…...

从短片到长片:王琦携《Mountain》续作迈向新高度

在王琦(Qi Wang)的带领下,广受关注的短片《Mountain》迎来了成长篇续作《Rite of the Mountain》。这一全新长片不仅是她从短片迈向长篇叙事的重要一步,更是一次大胆的艺术挑战。作为制片人的她,将继续以敏锐的视觉风格和深刻的叙事洞察,拓展《Mountain》所触及的情感深度,并构…...

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回&#xff0c;且在本地模型报错 记录自己学习应用DeepSeek的过程&#xff0c;使用的是自己电脑本地部署的私有化蒸馏模型...... &#xff08;举一反三&#xff0c;这个不单单是可以用…...

c#中“事件-event”的经典示例与理解

在C#编程语言中&#xff0c;事件&#xff08;Event&#xff09;是一个非常重要的概念&#xff0c;它提供了一种松耦合的方式&#xff0c;让对象间能够通知彼此&#xff0c;而无需直接联系。事件的使用可以让我们的代码更加灵活、可扩展且易于维护。 事件可以视作委托的实例&…...

如何画产品功能图、结构图

功能图的类型 常见的功能图包括数据流图、用例图、活动图、状态图、类图、组件图、部署图等等&#xff0c;不同的应用场景和目标下&#xff0c;需要确定不同的功能图类型。 数据流图 用例图 状态图 类图 组件图 组件图是由软件系统、组件和组件之间的关系组成的图形&#xf…...

标准输入输出流,面向对象,构造函数

标准输入输出流 为什么不直接用printf和scanf? 不能输入/输出C新增的内容 std C的一些标识符&#xff0c;都是定义在std这个名字空间下面cout 是什么&#xff1f; 1.是一个ostream对象 output stream:输出流使用 <<&#xff1a;输出流运算符 作用&#xff1a;将右边…...

Vue2 中使用 UniApp 时,生命周期钩子函数总结

在 Vue2 中使用 UniApp 时&#xff0c;生命周期钩子函数是一个重要的概念。它允许开发者在特定的时间点运行代码&#xff0c;管理组件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期钩子函数总结&#xff1a; 1. beforeCreate 说明: 组件实例刚被创建&#xff0c;此时数据…...

QEMU源码全解析 —— 内存虚拟化(12)

接前一篇文章:QEMU源码全解析 —— 内存虚拟化(11) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 QEMU内存管理模型...

如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传

目录 1. 初始化本地Git仓库 2. 添加文件到仓库 3. 提交更改 4. 创建并关联远程仓库 5. 推送代码到远程仓库 完整流程总结 要将Ubuntu下的一个目录&#xff08;例如rpc&#xff09;保存为一个Git仓库并上传到远程仓库&#xff0c;您可以遵循以下步骤&#xff1a; 1. 初始…...

深度学习中通道数的理解

目录 一、通道&#xff08;Channels&#xff09;的作用 1. 表示输入数据的多样性 2. 提取多层次特征 3. 信息融合与交互 4. 控制模型的复杂度 5. 支持多任务学习 6. 实际应用中的通道设计 7. 总结 二、案例一 1. 输入图像的通道&#xff08;RGB&#xff09; 2. 输出特…...

2025寒假天梯赛训练5

L1-3 敲笨钟 - 2025寒假天梯赛训练5 思路&#xff1a;一般ex的模拟题&#xff0c;主要是找好空格的位置进行修改替换。 #include <bits/stdc.h> using namespace std; #define int long long #define endl "\n" #define sz(x) (int)x.size() #define e empla…...

PowerBI 矩阵 列标题分组显示(两行列标题)

先看效果 数据表如下&#xff1a; 我们在powerbi里新建一个矩阵&#xff0c;然后如图加入字段&#xff1a; 我们就会得到这样的矩阵&#xff1a; 我们在“可视化”->“列”&#xff0c;上双击&#xff0c;输入空格&#xff0c;就能消除左上角的"类别"两字 同理修…...

服务器部署DeepSeek,通过Ollama+open-webui部署

1. 安装ollama 1.1. linux 安装 Ollama是目前常用的AI模式部署的第三方工具&#xff0c;能一键部署deepSeek Ollama官方网址https://ollama.com/ 选择Download下载对应的服务版本 服务器选择Linux&#xff0c;下面是下载代码 curl -fsSL https://ollama.com/install.…...

PVE 磁盘管理详解:从 Windows 到 Linux 的思维转换(文末附资源)

Proxmox VE&#xff08;PVE&#xff09;是一款基于 Debian Linux 的虚拟化平台&#xff0c;其文件系统管理与 Windows 差异较大&#xff0c;尤其是磁盘和文件夹的设计逻辑。本文将以通俗易懂的方式&#xff0c;详解 PVE 中磁盘管理的核心操作&#xff0c;并对比 Windows 帮助大…...

Ubuntu 连接 air pods

&#xff11;&#xff0e; sudo vim /etc/bluetooth/main.conf , 修改蓝牙模式为blder &#xff12;&#xff0e;sudo /etc/init.d/bluetooth restart, 重启蓝牙&#xff0c;即可连接成功...

【LeetCode Hot100 矩阵】矩阵置零、螺旋矩阵、旋转图像、搜索二维矩阵II

矩阵 1. 矩阵置零&#xff08;Set Matrix Zeroes&#xff09;解题思路步骤&#xff1a; 代码实现 2. 螺旋矩阵&#xff08;Spiral Matrix&#xff09;解题思路具体步骤&#xff1a; 代码实现 3. 旋转矩阵 90 度解决思路代码实现 5. 搜索二维矩阵中的目标值解决思路代码实现 1. …...

民用无人驾驶航空器操控员考试

1. 注册 民用无人驾驶航空器综合管理平台 (caac.gov.cn) 2. 选择 操控员资质 3. 安全操控理论培训 -> 在线视频培训 学习完后选择 【在线考试】 共 50道 单项 选择题&#xff0c;每选项3个&#xff0c;80分及格。 4. 查看 我的合格证 证书有效期2年...

TCP可靠传输的ARQ协议

基本知识 ARQ&#xff08;Automatic Repeat-reQuest&#xff09;协议主要包含&#xff1a;停等ARQ协议、连续ARQ协议&#xff0c;其中连续ARQ协议是为了解决停等ARQ协议信道利用率低的问题&#xff0c;目前传统的连续ARQ协议有回退N帧ARQ协议、选择性重传ARQ协议。 注意&#…...

秋招春招投递记录——2024

公司链接待办截止日期已完成状态携程集团&#xff08;上海&#xff09;https://campus.ctrip.com/campus-recruitment/简历挂微众银行&#xff08;武汉&#xff09;https://campus.webank.com/campus-recruitment/webankhr/测评腾讯云智&#xff08;重庆&#xff09;https://jo…...