安卓之四大组件

news2024/9/28 17:33:28
组件描述
Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。
Service(服务)Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。
Broadcast Receiver(广播接收器)一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。
Content Provider(内容提供者)作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等)

1.activity的切换

        <!---声明实现应用部分可视化界面的 Activity,必须使用 AndroidManifest 中的 <activity> 元素表示所有 Activity。系统不会识别和运行任何未进行声明的Activity。----->
        <activity  
            android:label="@string/app_name"  
            android:name="com.zj.wuaipojie.ui.MainActivity"  
            android:exported="true">  <!--当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动-->
            <!---指明这个activity可以以什么样的意图(intent)启动--->
            <intent-filter>  
                <!--表示activity作为一个什么动作启动,android.intent.action.MAIN表示作为主activity启动--->
                <action  
                    android:name="android.intent.action.MAIN" />  
                <!--这是action元素的额外类别信息,android.intent.category.LAUNCHER表示这个activity为当前应用程序优先级最高的Activity-->
                <category  
                    android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
        <activity  
            android:name="com.zj.wuaipojie.ui.ChallengeFirst" />
        <activity  
            android:name="com.zj.wuaipojie.ui.ChallengeFifth"  
            android:exported="true" />  
        <activity  
            android:name="com.zj.wuaipojie.ui.ChallengeFourth"  
            android:exported="true" />  
        <activity  
            android:name="com.zj.wuaipojie.ui.ChallengeThird"  
            android:exported="false" />  
        <activity  
            android:name="com.zj.wuaipojie.ui.ChallengeSecond"  
            android:exported="false" />  
        <activity  
            android:name="com.zj.wuaipojie.ui.AdActivity" />  

 

启动广告流程: 启动Activity->广告Activity->主页Activity

修改方法: 1.修改加载时间 2.Acitivity切换定位,修改Intent的Activity类名

        switch (position) {  
            case 0:  
                Intent intent = new Intent();  
                intent.setClass(it.getContext(), ChallengeFirst.class);  
                it.getContext().startActivity(intent);  
                return;  
            case 1:  
                Intent intent2 = new Intent();  
                intent2.setClass(it.getContext(), ChallengeSecond.class);  
                it.getContext().startActivity(intent2);  
                return;  
            case 2:  
                Intent intent3 = new Intent();  //new一个Intent,
                intent3.setClass(it.getContext(), AdActivity.class);  //传入要切换的Acitivity的类名
                it.getContext().startActivity(intent3);  //启动对应的Activity
                return;  
            case 3:  
                Intent intent4 = new Intent();  
                intent4.setClass(it.getContext(), ChallengeFourth.class);  
                it.getContext().startActivity(intent4);  
                return; 
            default:  
                return;  
        }

2.Activity生命周期

函数名称描述
onCreate()一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。
onStart()当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。
onResume()这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。
onPause()这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。
onStop()这个方法是在Activity完全不可见的时候调用的。
onDestroy()这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。
onRestart()当Activity从停止stop状态恢进入start状态时调用状态。

 

 

3.弹窗定位&堆栈分析

修改方法:

1.修改xml中的versiocode

2.Hook弹窗(推荐算法助手开启弹窗定位)

3.修改dex弹窗代码

4.抓包修改响应体(也可以路由器拦截)

4.布局优化

1.开发者助手抓布局

2.MT管理器xml搜索定位

3.修改xml代码

android:visibility="gone"

Activity生命周期:

一、如何创建Activity(活动)

1.Activity(活动)

2.新建一个类继承自Activity(活动)

二、Activity(活动)的声明周期从创建到销毁的过程所要执行的方法

1.创建Activity(活动)所要执行的方法 a.onCreate() 这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布 局、绑定事件等。 b.onStart() 这个方法在活动由不可见变为可见的时候调用。 c.onResume() 这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的 栈顶,并且处于运行状态。

2.Activity(活动)被销毁时所执行的方法 a.onPause() 这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方 法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度 一定要快,不然会影响到新的栈顶活动的使用。 b.onStop() 这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如 果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。 c.onDestroy() 这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

3.onRestart() 这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

三、生命周期的分类

  1. 完整生存期 活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情 况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完 成释放内存的操作。
  2. 可见生存期 活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存 期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两 个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载, 而在 onStop()方法中对资源进行释放, 从而保证处于停止状态的活动不会占用过多内存。
  3. 前台生存期 活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台 生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时 看到和接触最多的也这个状态下的活动。 

四.活动的注册

Activity的四种启动方式:

一、Activity(活动)的管理模式 Android采用Task来管理多个Activity。当启动一个APP时,Android就会为之创建一个Task,然后每启动一个activity,则把当前的activity压到栈顶。比如以此启动页面A->B->C,栈里面的结构如下所示 C------栈顶 B A------栈底 按返回键的时候,从栈顶弹出页面依次为C->B->A

二、Activity(活动)的四种启动模式 1.standard模式 它是活动默认的启动模式,在不进行显示制定的情况下,所有活动都会自动使用这种启动模式。每次通过此模式来启动activity时,Android总会为目标activity启动一个新的实例。 举个例子:activity A为standard模式,activity B为standard模式,activity C为standard模式,从A->B->C依次启动activity: C为栈顶 B A为栈底 按返回键的时候,从栈顶弹出页面依次为C->B->A

2.singleTop模式 I.比如Activity B启动模式为singleTop,Activity A为standard,此时从A页面跳转B页面,A->B时,会先在栈中查看栈顶是否存在B,存在的话,则复用栈顶B,调用onNewIntent方法,而不是重新new一个新的B。如果栈中不存在B,则会创建B。 II.再继续从B页面跳转B页面的时候,及A->B->B时,因为栈顶已经存在B了,则直接复用栈顶的B,调用onNewIntent方法,此时栈如下所示: B------栈顶 A------栈底

补充:

onNewIntent() 是 Android 开发中的一个方法,当一个活动(Activity)已经在前台运行时接收到一个新的意图(Intent)时,该方法会被调用。通常情况下,这种情况发生在活动使用 FLAG_ACTIVITY_SINGLE_TOP 标志启动多次时。

这里是 onNewIntent() 方法的基本解释:

  1. 当一个活动已经在前台运行时,如果收到一个新的意图,Android 不会重新创建这个活动,而是调用 onNewIntent() 方法,并将新的意图传递给活动。
  2. 您可以在您的活动中重写 onNewIntent() 方法,根据需要处理新的意图。这使您可以根据新的意图更新活动的状态或执行任何必要的操作。

以下是一个示例,展示了如何在您的 Android 活动中使用 onNewIntent() 方法:

javaCopy code
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    // 在这里处理新的意图
    String action = intent.getAction();
    if (action != null && action.equals("my_custom_action")) {
        // 根据自定义动作执行某些操作
    }
}

在这个示例中,如果活动接收到一个具有自定义动作 "my_custom_action" 的新意图,它会相应地执行一些特定的操作。

3.singleTask模式

singleTask 是 Android 活动(Activity)的启动模式之一,在清单文件(AndroidManifest.xml)中通过 android:launchMode="singleTask" 进行设置。当一个活动以 singleTask 模式启动时,系统会检查当前的任务栈中是否已经存在该活动的实例。如果存在,系统会将该任务栈移动到栈顶,并调用该活动的 onNewIntent() 方法,传递新的 Intent;如果不存在,系统会创建一个新的任务栈,并在其顶部放置该活动的实例。

使用这种加载模式的activity在同一个Task内只有一个实例,当系统采用此singleTask模式启动activity时,可以分为三种情况: a. 如果将要启动的activity不存在,系统将会创建目标activity实例,并将它加入到Task栈顶。 b.如果将要启动的activity已经位于Task栈顶,此时与singleTop模式的行为相同。 c. 如果将要启动的activity已经存在,但没有位于Task栈顶,系统将会把位于该activity上面的所有activity移出Task栈,从而使得目标activity转入栈顶。

模式的特点包括:

  1. 单一实例:在一个任务栈中只会存在一个该活动的实例。如果该活动已经存在于任务栈中,系统不会创建新的实例,而是调用已存在的实例。
  2. 任务栈位置:无论从何处启动该活动,它都会成为任务栈的根活动(Root Activity),并且该任务栈中的其他活动会被销毁。
  3. onNewIntent() 的调用:当活动已经存在且收到新的 Intent 时,系统会调用该活动的 onNewIntent() 方法来处理新的 Intent。
  4. 适用场景:适用于需要确保只有一个实例存在且可以接收全局 Intent 的情况,例如应用的主界面或者特定的处理程序。

要使用 singleTask 模式,只需在清单文件中声明活动时添加 android:launchMode="singleTask" 属性即可。

xmlCopy code
<activity
    android:name=".YourActivity"
    android:launchMode="singleTask">
    ...
</activity>

需要注意的是,使用 singleTask 模式需要慎重考虑,因为它可能会导致应用的行为与用户预期不符。特别是在多任务栈的情况下,可能会产生意想不到的结果。因此,建议在了解其工作原理并明确适用场景后再使用该启动模式。

4.singleInstance模式 假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?

使用前面三种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singleInstance 模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。 此加载模式下,无论从哪个Task中启动目标activity,只会创建一个目标activity实例,并会使用一个全新的Task栈来装载该activity实例。当系统采用singleInstance模式启动activity时

可以分为两种情况: a.如果将要启动的activity不存在,系统会先创建一个全新的Task、再创建目标activity的实例,并将它加入新的Task的栈顶。 b. 如果将要启动的activity已经存在,无论它位于哪个应用程序中,无论它位于哪个Task中,系统将会把该activity所在的Task转到前台,从而使用该activity显示出来。

补充:

singleInstance 通过在清单文件(AndroidManifest.xml)中设置 android:launchMode="singleInstance" 来定义。使用 singleInstance 模式启动的活动会在一个新的任务栈中启动,并且这个任务栈中只会包含该活动的一个实例。如果其他活动尝试启动具有 singleInstance 启动模式的活动,它们会被放置在不同的任务栈中。

singleInstance 模式的特点:

  1. 独立任务栈:使用 singleInstance 模式启动的活动会在一个新的任务栈中启动,该任务栈只包含这个活动的一个实例。
  2. 唯一实例:在整个系统中,只有一个该活动的实例存在。如果已经存在一个实例,系统会使用现有实例,并调用其 onNewIntent() 方法来传递新的 Intent;如果不存在,系统会创建一个新的任务栈并启动新的活动实例。
  3. 任务栈位置:无论从何处启动该活动,它都会成为新任务栈的根活动(Root Activity)。
  4. 适用场景:适用于需要确保只有一个实例存在,且该实例具有独立的任务栈的情况,例如应用中的全局服务或需要始终在特定环境中运行的活动。

要使用 singleInstance 模式,只需在清单文件中声明活动时添加 android:launchMode="singleInstance" 属性即可。

xmlCopy code
<activity
    android:name=".YourActivity"
    android:launchMode="singleInstance">
    ...
</activity>

singleInstance 模式提供了一种强大的机制来管理活动的生命周期和任务栈。

Activity与Activity之间的传值

一、Activity的跳转方式 1.startActivity(intent) 2.startActivityForResult(intent,code)

二、Activity与Activity之间的数据传递(Intent(媒介)) 1.Intent概念 意思是一个Intent是对一个即将进行的操作的抽象,Intent的字面意识就是”意图”,Android应用程序中的三种其他应用程序基本组件——Activity, Service和Broadcast Receiver,都是使用称为intent的消息来”激活”的。

  1. 如果是两个相邻activity之间的传值,使用Intent传值

3.使用startActivityForResult(intent,code)实现回传值

补充:

在Android开发中,有多种方法可以在Activity之间传递数据:

  1. Intent:可以使用Intent来传递数据。您可以将数据放入Intent的extras中,然后通过startActivity()启动另一个Activity。在目标Activity中,您可以使用getIntent()来获取传递的Intent,并使用getExtras()来检索数据。

    发送数据:

    javaCopy code
    Intent intent = new Intent(this, TargetActivity.class);
    intent.putExtra("key", value); // key为传递数据的标识符,value为要传递的数据
    startActivity(intent);
    
    

    接收数据:

    javaCopy code
    Intent intent = getIntent();
    if (intent != null) {
        String data = intent.getStringExtra("key");
        // 使用传递的数据
    }
    
    
  2. Bundle:类似于Intent,您可以在Intent中放入Bundle来传递数据。Bundle是一个键值对集合,可以存储各种数据类型。

    发送数据:

    javaCopy code
    Intent intent = new Intent(this, TargetActivity.class);
    Bundle bundle = new Bundle();
    bundle.putString("key", value); // key为传递数据的标识符,value为要传递的数据
    intent.putExtras(bundle);
    startActivity(intent);
    
    

    接收数据:

    javaCopy code
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        String data = bundle.getString("key");
        // 使用传递的数据
    }
    
    
  3. 静态变量:您可以使用静态变量在不同的Activity之间传递数据。这种方法简单直接,但需要注意内存泄漏和生命周期管理。

  4. SharedPreferences:如果要在多个Activity之间共享数据,您可以使用SharedPreferences来保存数据。

  5. 数据库:如果要存储大量结构化数据,并且需要在多个Activity之间共享,您可以使用SQLite数据库或其他数据库解决方案。

选择使用哪种方法取决于您的具体需求和应用场景。通常来说,对于简单的数据传递,Intent或Bundle是最常用的方式。

启动流程图:

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

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

相关文章

react04- mvc 、 mvvm

MVC与MVVM stackoverflow论坛网站 react前端框架 使用框架前&#xff1a; 操作dom > js获取dom元素&#xff0c;事件侦听&#xff0c;修改数据&#xff0c;设置样式。。。 操作dom问题: 直接操作dom&#xff0c;会造成大量的回流、重绘&#xff0c;消耗大量性能操作起来也…

MySQL基础---SQL语句2(WHERE、AND、OR、ORDER BY、COUNT)

1. WHERE 子句 1. 语法 WHERE 子句用于限定选择的标准 在 slelece、update、delete 语句中&#xff0c;皆可使用 WHERE 子句来限定选择的标准 -- 查询语句 select 列名称 form 表名称 where 列 运算符 值-- 更新语句 update 列名称 form 列新值 where 列 运算符 值-- 删除语句…

Linux——信号量

目录 POSIX信号量 信号量原理 信号量概念 信号量函数 基于环形队列的生产者消费者模型 生产者和消费者申请和释放资源 单生产者单消费者 多生产者多消费者 多生产者多消费者的意义 信号量的意义 POSIX信号量 信号量原理 如果仅用一个互斥锁对临界资源进行保护&#…

Vulnhub靶机:Kioptrix_Level1.2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;192.168.56.101&#xff09; 靶机&#xff1a;Kioptrix_Level1.2&#xff08;192.168.56.106&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vul…

【3月14日-云服务器推荐】阿里云 腾讯云 京东云有什么区别? 选购指南 最新价格对比 搭建博客 游戏服务器均可多用

3月14日更新&#xff0c;本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】云服务器1分钟教会你如何选择教程 https://docs.qq.com/document/DV0RCS0lGeH…

郭炜老师mooc第十一章数据分析和展示(numpy,pandas, matplotlib)

多维数组库numpy numpy创建数组的常用函数 # numpy数组import numpy as np #以后numpy简写为np print(np.array([1,2,3])) #>>[1 2 3] print(np.arange(1,9,2)) #>>[1 3 5 7] 不包括9 print(np.linspace(1,10,4)) #>>[ 1. 4. 7. 10.] # linespace(x,y,n)&…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的日常场景下的人脸检测系统(深度学习模型+PySide6界面+训练数据集+Python代码)

摘要&#xff1a;开发用于日常环境中的人脸识别系统对增强安全监测和提供定制化服务极为关键。本篇文章详细描述了运用深度学习技术开发人脸识别系统的全过程&#xff0c;并附上了完整的代码。该系统搭建在强大的YOLOv8算法之上&#xff0c;并通过与YOLOv7、YOLOv6、YOLOv5的性…

YOLOv9如何训练自己的数据集(NEU-DET为案列)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;教会你用自己数据集训练YOLOv9模型 YOLOv9魔术师专栏 ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ 包含注意力机制魔…

没有硬件基础可以学单片机吗?

没有硬件基础可以学单片机吗&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己&#xff0c…

Docker-基本命令

目录 一、Docker与虚拟机技术 二、Docker功能 三、安装 安装&#xff1a; 1、环境准备&#xff1a; 2、安装docker 3、配置阿里云镜像加速 镜像加速源 4、Docker是怎么工作的 5、Docker为什么比虚拟机快 四、docker命令 1、镜像命令 Docker官方镜像库&#xff1a…

深入理解与应用Keepalive机制

目录 引言 一、VRRP协议 &#xff08;一&#xff09;VRRP概述 1.诞生背景 2.基本理论 &#xff08;二&#xff09;VRRP工作原理 &#xff08;三&#xff09;VRRP相关术语 二、keepalive基本理论 &#xff08;一&#xff09;基本性能 &#xff08;二&#xff09;实现原…

Hadoop伪分布式配置--没有DataNode或NameNode

一、原因分析 重复格式化NameNode 二、解决方法 1、输入格式化NameNode命令&#xff0c;找到data和name存放位置 ./bin/hdfs namenode -format 2、删除data或name&#xff08;没有哪个删哪个&#xff09; sudo rm -rf data 3、重新格式化NameNode 4、重新启动即可。

Seata 2.x 系列【7】服务端集成 Nacos 2.x

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 安装 N…

Cassandra 集群安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装说明4.安装准备4.1.安装 JDK 114.2.安装 Python4.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/m…

校园新闻网站|基于SpringBoot+ Mysql+Java+B/S结构的校园新闻网站设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

运放的基础知识

运算放大器&#xff08;Operational Amplifier&#xff0c;简称运放&#xff09;是一种直流耦合、差模&#xff08;差动模式&#xff09;输入的高增益电压放大器&#xff0c;通常具有单端输出。它能产生一个相对于输入端电势差大数十万倍的输出电势&#xff08;对地而言&#x…

爬虫的去重

去重基本原理 爬虫中什么业务需要使用去重 防止发出重复的请求防止存储重复的数据 在爬取网页数据时&#xff0c;避免对同一URL发起重复的请求&#xff0c;这样可以减少不必要的网络流量和服务器压力&#xff0c;提高爬虫的效率&#xff0c;在将爬取到的数据存储到数据库或其…

ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

发生的错误信息&#xff1a; File "C:\Users\malongqiang\.conda\envs\ObjectDetection\lib\ssl.py", line 1309, in do_handshakeself._sslobj.do_handshake() ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 分析原因&#xff1a; …

网络编程:网络编程基础

一、网络发展 1.TCP/IP两个协议阶段 TCP/IP协议已分成了两个不同的协议&#xff1a; 用来检测网络传输中差错的传输控制协议TCP 专门负责对不同网络进行2互联的互联网协议IP 2.网络体系结构 OSI体系口诀&#xff1a;物链网输会示用 2.1网络体系结构概念 每一层都有自己独…

新生宿舍管理系统|基于springboot框架+ Mysql+Java+B/S架构的新生宿舍管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 学生功能模块 管理员功能 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究目的 开发环境 项目部…