面经:安卓学习笔记

文章目录

  • 1. Android系统架构
  • 2. Activity
    • 2.0 定义
    • 2.1 生命周期
    • 2.2 生命状态
    • 2.3 启动模式
  • 3. Service
    • 3.1 定义
    • 3.2 两种启动方式
    • 3.3 生命周期
    • 3.4 跨进程service
    • 3.5 IntentService
  • 4. BroadCastReceiver
    • 4.1 概念
    • 4.2 组成
    • 4.3 广播接收器的分类
    • 4.4 生命周期
    • 4.5 静态注册和动态注册
  • 5. ContentProvider
  • 6. Intent
    • 6.1 作用
    • 6.2 显示Intent和隐式Intent
  • 7. Fragment
    • 7.1 定义作用
  • Demo分析
    • 1. 监听电量变化
    • 2. 监听开机启动
  • 总结:组件知识
    • 界面
    • 通信
    • 存储
    • 资源
    • 其他
  • ADB工具使用

TODO:放个壳在这里 内容后续加

1. Android系统架构

在这里插入图片描述

  1. Linux内核层
    Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。
  2. 系统运行库层
    这一层通过一些C/C++库为Android系统提供了主要的特性支持。如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供了浏览器内核的支持等。在这一层还有Android运行时库,它主要提供了一些核心库,允许开发者使用Java语言来编写Android应用。另外,Android运行时库中还包含了Dalvik虚拟机(5.0系统之后改为ART运行环境),它使得每一个Android应用都能运行在独立的进程中,并且拥有一个自己的虚拟机实例。相较于Java虚拟机,Dalvik和ART都是专门为移动设备定制的,它针对手机内存、CPU性能有限等情况做了优化处理。
  3. 应用框架层
    这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者可以使用这些API来构建自己的应用程序。
  4. 应用层
    所有安装在手机上的应用程序都是属于这一层的,比如系统自带的联系人、短信等程序,或者是你从Google Play上下载的小游戏,当然还包括你自己开发的程序。
    核心总结
    框架中各层作用
    1、内核层:包含大量驱动;同时可让Android利用主要安全功能(系统和内核安全)。
    2、HAL:提供标准接口,屏蔽硬件差异。
    3、C/C++系统库:Android基础功能库。主要包括init孵化来的用户空间的守护进程
    Android Runtime:安卓应用的基础环境。
    4、系统系统框架层:连接应用层,为上层提供基础功能接口。
    5、系统应用层:包含各类应用,负责与用户进行交互。
    通过进程分析各层之间的联系
    1、 Loader层上电,加载预设参数,准备启动内核层的swapper进程。
    2、 内核层中swapper进程启动,加载驱动、启动Kthreadd线程、准备启动Init进程。
    3、 C++框架层启动Init进程,Init加载各类服务,同时开启最重要的Zygote进程。
    4、 Java 框架根据启动的Zygote进程,fork出system server进程。
    5、 应用层根据启动的system server进程开启应用。

2. Activity

2.0 定义

Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕

2.1 生命周期

在这里插入图片描述

onCreate():会在系统首次创建Activity时触发
onStart():当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 调用使 Activity 对用户可见,因为应用会为 Activity 进入前台并支持互动做准备
onResume():
Activity 会在进入“已恢复”状态时来到前台,然后系统调用 onResume() 回调。这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一Activity,或设备屏幕关闭。当发生中断事件时,Activity 进入“已暂停”状态,系统调用 onPause() 回调。如果 Activity 从“已暂停”状态返回“已恢复”状态,系统将再次调用 onResume() 方法。因此应实现 onResume(),以初始化在 onPause() 期间释放的组件,并执行每次 Activity进入“已恢复”状态时必须完成的任何其他初始化操作。
onPause()
系统将此方法视为用户将要离开您的 Activity 的第一个标志(尽管这并不总是意味着 Activity 会被销毁);此方法表示 Activity 不再位于前台。
onStop()
如果您的 Activity 不再对用户可见,说明其已进入“已停止”状态,因此系统将调用 onStop() 回调。
在 onStop() 方法中,应用应释放或调整在应用对用户不可见时的无用资源。例如,应用可以暂停动画效果,或从精确位置更新切换到粗略位置更新。
进入“已停止”状态后,Activity 要么返回与用户互动,要么结束运行并消失。如果 Activity 返回,系统将调用 onRestart()。如果 Activity 结束运行,系统将调用 onDestroy()。
onDestroy()
销毁 Activity 之前,系统会先调用 onDestroy()。

2.2 生命状态

运行状态:位于返回栈栈顶
暂停状态:不再位于栈顶,但是仍然可见
停止状态:不再位于栈顶,并且完全不可见
销毁状态:从返回栈中移除

2.3 启动模式

  • standard模式(默认)
    每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard 模式的Activity,系统不会在乎这个Activity 是否已经在返回栈中存在,每次启动都会创建一个该Activity 的新实例。
    在这里插入图片描述
  • singleTop 模式
    当Activity 的启动模式指定为singleTop ,在启动Activity 时如果发现返回栈的栈顶已经是该Activity ,则认为可以直接使用它,不会再创建新的Activity 实例。
    在这里插入图片描述
  • singleTask
    当Activity 的启动模式指定为singleTask ,每次启动该Activity 时,系统首先会在返回栈中检查是否存在该Activity 的实例,如果发现已经存在则直接使用该实例,并把在这个Activity 之上的所有其他Activity 统统出栈,如果没有发现就会创建一个新的Activity 实例。
    在这里插入图片描述
  • singleInstance
    指定为singleInstance 模式的Activity 会启用一个新的返回栈来管理这个Activity (其实如果singleTask 模式指定了不同的taskAffinity ,也会启动一个新的返回栈)
    在这里插入图片描述

3. Service

3.1 定义

服务是一个通用入口点,用于因各种原因使应用在后台保持运行状态。它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。服务不提供界面。

3.2 两种启动方式

(1)通过startService和stopService方式启动和停止服务
(2)通过bindService和unbindService的方式启动和停止服务

3.3 生命周期

在这里插入图片描述

  • startService()生命周期
    onCreate():当Service第一次被创建时,由系统调用
    onStartCommand(): 当调用startService方法启动Service时被调用
    onDestroy():当service不再使用时,由系统调用
  • bindService()生命周期
    onBind():当bindService方法启动Service时被调用
    onUnbind(): 当unbindService方法解除绑定时被调用

3.4 跨进程service

通过aidl实现c/s提供服务接口流程
(1)服务端Service
Service端提供暴露服务端接口的aidl文件
创建aidl文件,在接口包内添加服务端的接口
创建完毕后立刻编译
service代码文件:MyService.java
继承aidl的接口代替非跨进程调用中service使用bind接口,在onBind中返回该接口实例
AndroidManifest.xml
注册服务并设置Inten过滤器
(2)客户端Client
添加aidl文件
文件的路径、包名、接口名都需要一致
MainActivity.java
剩余部分和正常的bindService中MainActvity的流程基本一致:创建对应的binder(跨进程调用就是对应的aidl接口),创建ServiceConnected实例并重写onServiceConnected和onServiceDisconnected方法,以及MainActivity中的剩余的应有逻辑。

3.5 IntentService

IntentService是 Scrvice 的子类,增加了额外的功能。
Service存在的问题
Service不会专门启动一个单独的进程,Service和它所在的应用在同一个进程中。Service不是一条新的线程,因此不应该在Service中直接处理耗时的任务,会阻塞主线程,造成ANR(程序无响应)异常。
IntentService的优点
IntentService会创建单独的worker线程来处理所有的Intent请求。 在执行耗时操作时,不会阻塞主线程,更不会产生ANR。 IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,所以不用处理多线程问题,执行完毕后会自行调用onDestroy()方法进行关闭。

4. BroadCastReceiver

4.1 概念

BroadCast Receiver(广播接收者)使用了设计模式中的观察者模式(基于消息的发布/订阅事件模型),用于响应来自其他应用程序或者系统的广播消息,是一个全局监听器。

4.2 组成

1)消息订阅者(广播接收者): 广播接收者通过 Binder机制在AMS注册
2)消息发布者(广播发布者): 广播发送者通过 Binder 机制向AMS发送广播
3)消息中心(AMS,即Activity Manager Service): AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者,AMS将广播发送到合适的广播接收者相应的消息循环队列中。 广播接收者通过消息循环拿到此广播,并回调 onReceive()

4.3 广播接收器的分类

  1. 标准广播

    是一种完全异步执行的广播,通过context. senddBroadcast(intent)方法发送。在广播发出后,所有的BroadcastReceiver几乎在同一时刻收到这个广播消息,它们之间没有先后顺序,这种广播的效率较高,并且不能被拦截。

  2. 有序广播

    是一种同步执行的广播,通过context. sendOrderedBroadcast(intent)方法发送。在广播发出之后,同一时刻只有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递(通过setResult()方法传递,通过getResult()方法接收)。即广播接收器有先后顺序,优先级高(在receiver的intent-filter中的android:priority属性设置)的广播接收器可以先收到广播消息,且前面的广播接收器还可以截断正在传递的广播(通过abortBroadcast()方法丢弃),这样后面的广播接收器就无法收到广播消息。

  3. 本地广播
    上述俩种广播是全局广播,所有应用均可收到,而本地广播仅在进程内传播,有保护数据安全的作用。调用者不同,本地广播调用的是LocalBroadcastManager相关方法,全局广播调用的是Context的相关方法。且本地广播没有静态注册的方法。

  4. 系统广播
    Andrroid内置了多个系统广播。使用系统广播时,只需在注册广播接收者时定义相关的action即可。

4.4 生命周期

BroadcastReceiver的生命周期从对象调用它开始,到onReceiver方法执行完成之后结束。
每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。如果我们在Activity中注册了BroadcastReceiver,当Activity销毁时要主动撤销注册(即添加onDestroy方法),否则会出现异常。

4.5 静态注册和动态注册

案例学习:监听电池电量变化,Android四大组件——BroadcastReceiver——动态注册和静态注册 - 虞美人体重90 - 博客园 (cnblogs.com)
https://www.cnblogs.com/Xiang-MY/p/16191383.html
动态注册:广播接收器可以自由的控制注册与取消,具有灵活性。因为其生命周期与对应的Acitivity的生命周期是一致的,所以只有在应用程序启动后才能收到广播。
静态注册:在AndroidManifest.xml中进行注册。静态注册的广播不受程序生命周期的影响,当应用程序关闭后,仍可以接收到广播

动态注册的BroadcastReceiver可以自由控制注册和注销,但必须在程序启动之后才能接收广播,因为注册的逻辑是写在onCreate()中的。
静态注册的BroadcastReceiver可以在程序未启动的情况下也能接收广播。

5. ContentProvider

ContentProvider主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前,使用ContentProvider是Android实现跨程序共享数据的标准方式。

6. Intent

在这里插入图片描述

Android开发 - Intent和Broadcast Receiver - guqiangjs - 博客园 (cnblogs.com)
https://www.cnblogs.com/guqiangjs/p/5932612.html

6.1 作用

Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端

6.2 显示Intent和隐式Intent

 显式Intent
对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
 隐式Intent
隐式的Intent提供了一种机制,可以让匿名的应用程序组件响应动作请求。这意味着可以要求系统启动一个可执行给定动作的Activity,而不必知道需要启动哪个应用程序或者Activity。
例如希望让用户从应用程序中拨打电话,那么可以实现一个新的拨号程序,也可以使用一个隐式的Intent来请求一个在电话号码(表示为一个URI)上执行动作。

7. Fragment

Fragment详解之一——概述_fragment启舰_启舰的博客-CSDN博客

https://blog.csdn.net/harvic880925/article/details/44917955

7.1 定义作用

Fragment是一种可以嵌入在Activity当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛

Demo分析

1. 监听电量变化

新建一个类,让它继承BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑可在该方法中处理。(广播的动态注册)
监听电量变化的广播还需要打开权限:

package com.java.androidstudy;import androidx.appcompat.app.AppCompatActivity;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//我们要收听的频道是:电量变化IntentFilter  intentFilter = new IntentFilter();intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);//电量变化,想监听什么广播,就添加相应的action//创建接收者BatteryLeveReceiver batteryLeveReceiver = new BatteryLeveReceiver();//动态注册广播this.registerReceiver(batteryLeveReceiver,intentFilter);}//第一步,创建一个广播接收者,继承自BroadcastReceiverprivate class BatteryLeveReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//在这里写接收到广播后的逻辑处理String action = intent.getAction();Log.d(TAG,"收到了电量变化的广播,action is ==>"+action);Log.d(TAG,"当前电量:"+intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0));//获取电量,可戳进BatteryManager的源代码看看}}//取消广播注册,否则会造成内存卡顿@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(batteryLeveReceiver);}

效果展示:
运行后,在模拟器上拖动电量:
在这里插入图片描述

2. 监听开机启动

静态注册

//第一步:新建BootCompleteReceiver类   
public class BootCompleteReceiver extends BroadcastReceiver {private static final String TAG="BootCompleteReceiver";@Overridepublic void onReceive(Context context, Intent intent) {//第三步,收到开机广播后做的事情String action = intent.getAction();Log.d(TAG,"action is =="+action);Log.d(TAG,"开机完成");Toast.makeText(context,"收到开机完成的广播",Toast.LENGTH_SHORT).show();//静态注册,不需要启动程序也可以接收到广播,不需要取消注册。}
}

然后,我们需要在AndroidManifest.xml文件中标签内进行开机广播的静态注册。

<receiver android:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"><!-- 第二步,静态注册action --><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" />  </intent-filter></receiver>

此外,我们还需要打开开机广播的权限

现在运行程序后重启模拟器,日志截图如下:
在这里插入图片描述

总结:组件知识

界面

Activity —— Android最基本的界面容器,用于显示所有APP的内容
Fragment—— Android碎片化界面容器,用于嵌入显示APP指定内容
Layout文件 —— 布局文件,与Activity,Fragment,Adapter,自定义View一起使用,用于绘制界面布局和内容
Adapter —— 界面适配器。用于为重复显示组件如ListView GridView等组件编写列表项显示内容和显示逻辑
控件类 —— 主要是设置各种控件的事件监听器,如OnClickListener等
容器类 —— LinearLayOut,RelativeLayout,FrameLayout,ScrollView等
组件类 —— Button,TextView,EditText,ImageView等
列表类 —— ListView,GridView,RecycleView等

通信

Intent —— 传递数据的容器,主要用于Activity,Fragment界面跳转以及广播发送和接收等数据传递行为中。
ContentProvider —— 内容共享者,主要用于跨应用来获取其他应用的数据或者数据库。

存储

SharedPreference —— 通过key-value键值对的形式来保存数据,适合小量数据
SQLite —— 数据库,用于本地存储大量数据

资源

String —— 存储全局字符串, 通常将所有字符串资源都存放在string中
Dimen —— 主要用于保存控件的各类尺寸。一般将全局尺寸写在dimen中
Mipmap —— 主要用于存储各种应用的各种图标资源文件
Drawable —— 要勇于存储图片,shape和selector等图像资源。图像可以通过各种dpi来区分分辨率以达到不同分辨率视频的效果。
Color —— 存储全局颜色值,便于进行统一更改。
Assest —— 存放静态资源,如html页面等。

其他

Service —— 后台服务
Application —— 全局应用对象
Mainfest —— android项目配置菜单文件,用于注册和配置activity,service等,用于配置权限和应用设置选项。

ADB工具使用

添加链接描述
启用ADB服务: adb start-server
关闭ADB服务: adb kill-server
使用指定ADB设备:adb -s , 为adb devices获得的序列号,如上图:lcc77709
设置端口转发为5555: adb tcpip 5555
开启网络调试:adb connect xxx.xxx.xxx.xxx:5555。xxx.xxx.xxx.xxx为手机局域网IP
断开网络调试:adb disconnect xxx.xxx.xxx.xxx:1234
使用usb连接: adb usb
使用root模式: adb root
重启设备: adb reboot
关机: adb shell reboot -p。
重启到rec模式(fb模式): adb reboot recovery(fastboot)
查看已连接的设备信息:adb devices
查看adb 版本信息:adb version
查看日志:adb logcat
列出手机装的所有app 的包名:adb shell pm list packages
列出系统应用的所有包名:adb shell pm list packages -s

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

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

相关文章

Blender界面学习02

学习视频 【基础篇】1.3 认识界面_哔哩哔哩_bilibili 基本的3d建模的流程是什么&#xff1f; 四个角现出加号时可以拆分窗口&#xff0c;也可以合并窗口 向自己的方向拉是合并&#xff0c;向不是自己的方向拉是合并 如果界面搞乱后需要回到原来的布局 然后在新建的布局上右击 …

探秘C语言扫雷游戏实现技巧

本篇博客会讲解&#xff0c;如何使用C语言实现扫雷小游戏。 0.思路及准备工作 使用2个二维数组mine和show&#xff0c;分别来存储雷的位置信息和排查出来的雷的信息&#xff0c;前者隐藏&#xff0c;后者展示给玩家。假设盘面大小是99&#xff0c;这2个二维数组都要开大一圈…

Java“牵手”1688淘口令转换API接口数据,1688API接口申请指南

1688平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(一)

一、点击手势&#xff08;TapGesture&#xff09; TapGesture(value?:{count?:number; fingers?:number}) 点击手势支持单次点击和多次点击&#xff0c;拥有两个可选参数&#xff1a; count&#xff1a;非必填参数&#xff0c;声明该点击手势识别的连续点击次数。默认值为…

git submodule 子模块的基本使用

常用命令 命令说明git submodule add <url> <本地路径>添加子模块git submodule update --init --recursive添加子模块后&#xff0c;同步子模块内容git clone <url> --recurse-submodules克隆带有子模块的项目git submodule init初始化子模块git submodule…

图神经网络教程之HAN-异构图模型

异构图 包含不同类型节点和链接的异构图 异构图的定义&#xff1a;节点类别数量和边的类别数量加起来大于2就叫异构图。 meta-path元路径的定义&#xff1a;连接两个对象的复合关系&#xff0c;比如&#xff0c;节点类型A和节点类型B&#xff0c;A-B-A和B-A-B都是一种元路径。 …

Linux上git的简单使用

git的作用&#xff1a;版本控制多人协作 客户端 磁盘上的文件-->本地仓库-->远端仓库 服务端 gitee和GitHub是基于git的商业化网站 git的命令行如何使用&#xff1f; 1、新建一个仓库 .git ignore 是忽略带有某些后缀的文件的上传。 例如&#xff1a;里面有 .sln …

实战:基于卷积的MNIST手写体分类

前面实现了基于多层感知机的MNIST手写体识别&#xff0c;本章将实现以卷积神经网络完成的MNIST手写体识别。 1. 数据的准备 在本例中&#xff0c;依旧使用MNIST数据集&#xff0c;对这个数据集的数据和标签介绍&#xff0c;前面的章节已详细说明过了&#xff0c;相对于前面章…

vmware 16增加硬盘容量并在Ubuntu 18.04上边格式化并挂载

参考了《增加 VM虚拟机硬盘容量》 《Linux学习之分区挂载》中有给VMWare 16虚拟机添加一块硬盘的内容&#xff0c;需要先参考添加硬盘。 sudo mkfs.ext4 /dev/sda4给/dev/sda4进行ext4格式化。 sudo mkdir /mountsda4新建一个挂载目录。 sudo mount -t ext4 /dev/sda4 /mo…

AMBEO 双声道空间音频现已迈进直播制作领域

图片来源&#xff1a;Unsplash&#xff0c;作者&#xff1a;Bence Balla-Schottner AMBEO 双声道空间音频现已迈进直播制作领域 为所有观众解锁更加身临其境的听觉体验 森海塞尔将功能强大的 AMBEO 双声道空间音频技术引入了广播电视直播应用领域&#xff0c;对所有体育赛事广…

AD16 基础应用技巧(一些 “偏好“ 设置)

1. 修改铺铜后自动更新铺铜 AD16 铺铜 复制 自动变形 偏好设置 将【DXP】中的【参数选择】。 将【PCB Editor】中的【General】&#xff0c;然后勾选上【Repour Polygons After Modification】。 2. PCB直角走线处理与T型滴泪 一些没用的AD技巧——AD PCB直角走线处理与…

seq2seq与引入注意力机制的seq2seq

1、什么是 seq2seq&#xff1f; 就是字面意思&#xff0c;“句子 到 句子”。比如翻译。 2、seq2seq 有一些特点 seq2seq 的整体架构是 “编码器-解码器”。 其中&#xff0c;编码器是 RNN&#xff0c;并将 最后一个hidden state&#xff08;隐藏状态&#xff09;【即&…

【自用】西门子s7-200连接显示屏和物联网盒子完整配置过程

总览 1.PLC配置 2.显示屏配置 3.物联网盒子配置 一、PLC配置 1.连接PLC软件 STEP-7MicroWIN V4.0 SP9完整版 链接&#xff1a;https://pan.baidu.com/s/17LMEXnbkQZMPI8Bte24Eug?pwdjsi3 提取码&#xff1a;jsi3 2.PLC配置 打开 PLC 上面的小盖子&#xff0c;把红色按钮…

前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)

效果 代码 <!DOCTYPE html> <html><head><style>/* 左侧超链接列表 */.link {display: block;padding: 8px;background-color: #f2f2f2;cursor: pointer;}/* 顶部标签栏 */#tabsContainer {width:98%;display: flex;align-items: center;overflow-x: …

简易虚拟培训系统-UI控件的应用4

目录 Slider组件的常用参数 示例-使用Slider控制主轴 示例-Slider控制溜板箱的移动 本文以操作面板为例&#xff0c;介绍使用Slider控件控制开关和速度。 Slider组件的常用参数 Slider组件下面包含了3个子节点&#xff0c;都是Image组件&#xff0c;负责Slider的背景、填充区…

Ubuntu下的QT开发

ubuntu安装QT的组件如下&#xff1a; 若要在ubuntu下启动QT有两种方案&#xff0c;一种是在菜单栏搜索qt双QT Create&#xff1b;另一种则是使用命令&#xff1a;/opt/Qt5.12.9/Tools/QtCreator/bin/qtcreator.sh

pytest自动化测试两种执行环境切换的解决方案

目录 一、痛点分析 方法一&#xff1a;Hook方法pytest_addoption注册命令行参数 1、Hook方法注解 2、使用方法 方法二&#xff1a;使用插件pytest-base-url进行命令行传参 一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&am…

C语言每日一练--------Day(11)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;找到数组中消失的数字 哈希表 &#x1f493;博主csdn个人主页&#xff…

Kao框架学习

中间件&#xff1a;洋葱模型 这是官网上给出的示例&#xff0c;从logger依次往下执行&#xff0c;执行到最底层的response往回退&#xff0c;结构很像同心圆的洋葱从外层向内层再由内层向外层。 next表示暂停当前层的代码进入下一层&#xff0c; 当最后一层执行完毕开始回溯&a…

Jenkins清理构建(自动)

需求背景实现方法 Dashboard-->Project-->配置-->General-->Discard old builds # 注意&#xff1a;自动清理构建历史将在下次构建时进行