Android App开发基础

news2024/12/25 12:24:24

文章目录

  • 一 App的开发特点
    • 1.1 App的运行环境
    • 1.2 App开发语言
      • 1.3 java语言开发
      • 1.4 Kotlin语言开发
      • 1.5 XML
    • 1.6 App连接的数据库
  • 二 App的工程结构
    • 2.1 App工程目录结构
    • 2.2 构建工具Grade
    • 2.3 编译配置文件build.gradle
    • 2.4 运行配置文件AndroidManifest.xml
      • 2.4.1 application
      • 2.4.2 activity
  • 三 App的设计规范
    • 3.1 界面设计与代码逻辑
    • 3.2 完整的页面创建过程包括三个步骤:
    • 3.3 XML标记描绘应用界面
    • 3.4 Java代码书写程序逻辑
    • 3.5 App的活动页面
      • 3.5.1 创建新的App页面
      • 3.5.2 快速生成页面源码
      • 3.5.3 跳转页面的实现

一 App的开发特点

1.1 App的运行环境

  • App是在手机上运行的一类应用软件,而应用软件依附于操作系统。
  • 智能手机流行的操作系统有两种,分别是安卓手机的Android和苹果手机的iOS。
  • App开发为Android上的应用开发,Android系统基于Linux内核,但不等于Linux系统,故App应用无法在Linux系统上运行。
  • Android Studio是谷歌官方推出的App开发环境,它提供了三种操作系统的安装包,分别是Windows、Mac和Linux。
  • 开发者可以在电脑上安装Android Studio,并使用Android Studio开发App项目,但是编译出来的App在电脑上跑不起来。那该怎样验证App的界面展示及其业务逻辑是否正确呢?
  • 为了提供App开发的功能测试环境,一种办法是利用Android Studio创建内置的模拟器,然后启动内置模拟器,再在模拟器上运行App应用。另一种办法是使用真实手机测试App,该办法在实际开发中更为常见。
  • 利用真机调试要求具备以下5个条件:
    1. 使用数据线把手机连到电脑上
      • 手机的电源线拔掉插头就是数据线。数据线长方形的一端接到电脑的USB接口,即可完成手机与电脑的连接。
    2. 在电脑上安装手机的驱动程序
      • 一般电脑会把手机当作USB存储设备一样安装驱动,大多数情况会自动安装成功。如果遇到少数情况安装失败,需要先安装手机助手,由助手软件下载并安装对应的手机驱动。
    3. 打开手机的开发者选项并启用USB调试
      • 手机出厂后默认关闭开发者选项,需要开启开发者选项才能调试App。
      • 打开手机的设置菜单,进入“系统”→“关于手机”→“版本信息”页面,这里有好几个版本项,每个版本项都使劲点击七、八下,总会有某个版本点击后出现“你将开启开发者模式”的提示。继续点击该版本开启开发者模式,然后退出并重新进入设置页面,此时就能在“系统”菜单下找到“开发者选项”或“开发人员选项”了。进入“开发者选项”页面,启用“开发者选项”和“USB调试”两处开关,允许手机通过USB接口安装调试应用。
    4. 将连接的手机设为文件传输模式,并允许计算机进行USB调试
      • 手机通过USB数据线连接电脑后,屏幕弹出选择列表,请求选择某种USB连接方式。这里记得选中“传输文件”,因为充电模式不支持调试App。
      • 选完之后手机桌面弹出确认窗口,提示开发者是否允许当前计算机进行USB调试。这里勾选“始终允许使用这台计算机进行调试”选项,再点击右下角的确定按钮,允许计算机在手机上调试App
    5. 手机要能正常使用
      • 锁屏状态下,Android Studio向手机安装App的行为可能会被拦截,所以要保证手机处于解锁状态,才能顺利通过电脑安装App到手机上。
      • 经过以上步骤,总算具备通过电脑在手机上安装App的条件了。启动Android Studio,在顶部中央的执行区域看到已连接的手机信息,单击手机名称右边的三角运行按钮,等待Android Studio往手机上安装App
  • 如果是初学阶段,可以先使用模拟器,等后期在使用真机测试

1.2 App开发语言

在这里插入图片描述

  • 基于安卓系统的App开发主要有两大技术路线,分别是原生开发和混合开发
    • 原生开发指的是在移动平台上利用官方提供的编程语言(例如Java、Kotlin等)、开发工具包(SDK)、开发环境(Android Studio)进行App开发;
    • 混合开发指的是结合原生与H5技术开发混合应用,也就是将部分App页面改成内嵌的网页,这样无须升级App、只要覆盖服务器上的网页,即可动态更新App页面。
  • 在创建新项目时,弹出的项目配置对话框,Language栏进行选择
    在这里插入图片描述

1.3 java语言开发

  • Java是Android开发的主要编程语言
  • 虽然Android开发需要Java环境,但没要求电脑上必须事先安装JDK,因为Android Studio已经自带了JRE
  • 依次选择菜单File→Project Structure,弹出项目结构对话框
    在这里插入图片描述
    在这里插入图片描述

1.4 Kotlin语言开发

  • Kotlin是谷歌官方力推的又一种编程语言,它与Java同样基于JVM(Java Virtual Machine,即Java虚拟机),且完全兼容Java语言。创建新项目时,在Language栏下拉可选择Kotlin

1.5 XML

  • XML全称为Extensible Markup Language,即可扩展标记语言.
  • XML并非编程语言,只是一种标记语言。它类似于HTML,利用各种标签表达页面元素,以及各元素之间的层级关系及其排列组合。每个XML标签都是独立的控件对象,标签内部的属性以“android:”打头,表示这是标准的安卓属性,各属性分别代表控件的某种规格。
<TextView
        android:id="@+id/tv"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Hello World!" />
  • id:控件的编号。
  • layout_width:控件的布局宽度,wrap_content表示刚好包住该控件的内容。
  • layout_height:控件的布局高度,wrap_content表示刚好包住该控件的内容。
  • text:控件的文本

1.6 App连接的数据库

  • Android内置了专门的数据库名为SQLite,它遵循关系数据库的设计理念,SQL语法类似于MySQL。
  • SQLite无须单独安装,因为它内嵌到应用进程当中,所以App无须配置连接信息,即可直接对其增删改查。由于SQLite嵌入到应用程序,省去了配置数据库服务器的开销,因此它又被归类为嵌入式数据库。
    • 手机端的App,连同程序代码及其内置的嵌入式数据库,其实是个又独立又完整的程序实体,它只负责手机上的用户交互与信息处理,该实体被称作客户端。
    • 后端的Java Web服务,包括Web代码和数据库服务器,同样构成另一个单独运行的程序实体,它只负责后台的业务逻辑与数据库操作,该实体被称作服务端。
    • 客户端与服务端之前通过HTTP接口通信,每当客户端觉得需要把信息发给服务端,或者需要从服务端获取信息时,客户端便向服务端发起HTTP请求,服务端收到客户端的请求之后,根据规则完成数据处理,并将处理结果返回给客户端。这样客户端经由HTTP接口并借服务端之手,方能间接读写后端的数据库服务器。
      在这里插入图片描述
  • 一个具备用户管理功能的App系统,实际上并不单单只是手机上的一个应用,还包括与其对应的Java Web服务。手机里的客户端App,面向的是手机用户,App与用户之间通过手机屏幕交互;而后端的服务程序,面向的是手机App,客户端与服务端之间通过HTTP接口交互。
    在这里插入图片描述

二 App的工程结构

2.1 App工程目录结构

  • App工程分为两个层次
    • 第一个层次是项目,依次选择菜单File→New→New Project即可创建新项目。
    • 另一个层次是模块,模块依附于项目,每个项目至少有一个模块,也能拥有多个模块,依次选择菜单File→New→New Module即可在当前项目创建新模块。
  • 一般所言的“编译运行App”,指的是运行某个模块,而非运行某个项目,因为模块才对应实际的App。

在这里插入图片描述

  • 项目下面有两个分类:一个是app(代表app模块);另一个是Gradle Scripts
    在这里插入图片描述
    在这里插入图片描述

  • app下面有3个子目录加粗样式,其功能说明如下:

    1. manifests子目录:只有一个XML文件,即AndroidManifest.xml——App的运行配置文件
    2. java子目录:有3个com.xxx.myapp包,其中第一个包存放当前模块的Java源代码,后面两个包存放测试用的Java代码。
    3. res子目录:存放当前模块的资源文件。该目录同时又有4个子目录:
      • drawable目录存放图形描述文件与图片文件
      • layout目录:存放App页面的布局文件。
      • mipmap目录:存放App的启动图标。
      • values目录:存放一些常量定义文件。例如:字符串常量strings.xml、像素常量dimens.xml、颜色常量colors.xml、样式风格定义styles.xml等
      • xml:可在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处。
  • Gradle Scripts下面主要是工程的编译配置文件,主要有:

文件名称说明
build.gradle该文件分为项目级与模块级两种,用于描述App工程的编译规则。
proguard-rules.pro用于描述Java代码的混淆规则
gradle.properties用于配置编译工程的命令行参数,一般无须改动
settings.gradle配置需要编译的模块。初始内容为include ':app',表示只编译app模块。
local.properties项目的本地配置文件,它在工程编译时自动生成,用于描述开发者电脑的环境配置,包括SDK的本地路径、NDK的本地路径等。
  • 这里所说的混淆规则是apk的安全保护措施,在打包时,将相关的代码内容进行替换,以起到混淆窥探者,保护程序的版权

2.2 构建工具Grade

  • Gradle 是一个项目自动化构建工具,帮我们做了依赖、打包、部署、发布、各种渠道的差异管理等工作
    在这里插入图片描述

2.3 编译配置文件build.gradle

  • 新创建的App项目默认有两个build.gradle,一个是Project项目级别的build.gradle;另一个是Module模块级别的build.gradle

  • 项目级别的build.gradle指定了当前项目的总体编译规则
//全局配置文件中定义版本号,然后在模块级别的配置文件进行配置
plugins {
    id 'com.android.application' version '7.4.1' apply false
    id 'com.android.library' version '7.4.1' apply false
}
  • 补充内容:
buildscript {
	repositories {
		// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件
		maven { url 'https://maven.aliyun.com/repository/jcenter' }
		maven { url 'https://maven.aliyun.com/repository/google'}
		maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
		maven { url 'https://maven.aliyun.com/repository/public'}
		google()
		jcenter()
	}
	dependencies {
		// 配置gradle插件版本,下面的版本号就是Android Studio的版本号
		classpath 'com.android.tools.build:gradle:4.1.0'
	}
}
  • 在该文件中可添加buildscriptrepositoriesdependencies两个节点,其中repositories节点用于设置Android Studio插件的网络仓库地址,而dependencies节点用于设置gradle插件的版本号
  • 由于官方的谷歌仓库位于国外,下载速度相对较慢,因此可在repositories节点添加阿里云的仓库地址,方便国内开发者下载相关插件。

  • 模块级别的build.gradle对应于具体模块,每个模块都有自己的build.gradle,它指定了当前模块的详细编译规则
plugins {
    id 'com.android.application'
}

android {
    //配置命名空间
    namespace 'com.yang.myfirstapplication'
    // 指定编译用的SDK版本号。比如33表示使用Android 13编译
    compileSdk 33
    //指定编译工具的版本号。
    // 头两位数字必须与compileSdkVersion保持一致,具体的版本号可在sdk安装目录的“sdk\build-tools”下找到
    buildToolsVersion '30.0.3'

    defaultConfig {
        // 指定该模块的应用编号,也就是App的包名
        applicationId "com.yang.myfirstapplication"
        //指定App适合运行的最小SDK版本号,如21 表示至少要在Android 5.0上运行
        minSdk 21
        //指定目标设备的SDK版本号。【App最希望在该版本的Android上运行】
        targetSdk 33
        //指定App的应用版本号
        versionCode 1
        //指定App的应用版本名称
        versionName "1.0"
        //单元测试类
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            //指定混淆文件
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}
// 指定App编译的依赖信息
dependencies {
    //版本兼容库
    implementation 'androidx.appcompat:appcompat:1.4.1'
    //网络依赖库,在构建项目时,grade自动去网络上下载相应的依赖文件
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    // 指定单元测试编译用的junit版本号
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
  • Gradle工具的版本配置在gradle\wrapper\gradle-wrapper.properties,也可以依次选择菜单File→Project Structure→Project,在弹出的设置页面中修改Gradle Version
    在这里插入图片描述
    在这里插入图片描述
  • 注意:每个版本的Android Studio都有对应的Gradle版本,只有二者的版本正确对应,App工程才能成功编译
  • 具体的版本匹配信息参看官网内容

2.4 运行配置文件AndroidManifest.xml

  • AndroidManifest.xml指定了App的运行配置信息,它是一个XML描述文件
  • 位置
    在这里插入图片描述
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
	
	<!--
        allowBackup:应用备份
        dataExtractionRules:备份和转移配置
        fullBackupContent:自动备份配置
        icon:应用图标
        label:应用名称
        supportsRtl: 阿拉伯语的支持
        theme: 应用显示风格
        targetApi: 目标Android版本
    -->
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyFirstApplication"
        tools:targetApi="31">
        <!-- activity节点指定了该App拥有的活动页面信息,其中拥有android.intent.action.MAIN的activity说明它是入口页面-->
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity2"></activity>
    </application>

</manifest>
  • AndroidManifest.xml的根节点为manifest,它的package属性指定了该App的包名

2.4.1 application

  • manifest的application节点的各属性简介:
属性名说明
android:allowBackup应用备份开关。【true表示允许,false则表示不允许。】允许用户备份系统应用和第三方应用的apk安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复。
android:icon指定App在手机屏幕上显示的图标。
android:label指定App在手机屏幕上显示的名称。
android:roundIcon指定App的圆角图标。
android:supportsRtl是否支持阿拉伯语/波斯语这种从右往左的文字排列顺序。为true表示支持,为false则表示不支持。
android:theme指定App的显示风格
  • application属性的官方文档

2.4.2 activity

  • Activity 是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务
  • application下的activity节点,它是活动页面的注册声明,只有在AndroidManifest.xml中正确配置了activity节点,才能在运行时访问对应的活动页面。初始配置的MainActivity正是App的默认主页。
    <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    
  • 完整的活动页面注册标签
    <!--活动页面的注册声名-->
       <activity
            android:name=".MainActivity"
            android:exported="true">
            <!--如果有多个activity进行如下的intent-filter配置,桌面会出现两个app图标-->
            <intent-filter>
                <!--action:配置入口页面-->
                <action android:name="android.intent.action.MAIN" />
                <!--category:配置屏幕是否显示图标-->
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity2"></activity>
    </application>
    

三 App的设计规范

  • App工程的源码设计规范:App将看得见的界面设计与看不见的代码逻辑区分开,然后利用XML标记描绘应用界面,同时使用Java代码书写程序逻辑,从而形成App前后端分离的设计规约,有利于提高App集成的灵活性。

3.1 界面设计与代码逻辑

  • 类似与Web网站前后端分离的模式,App也采用了前后端分离设计
    在这里插入图片描述
  • App前后端分离的优势
    1. 使用XML文件描述App界面,方便及时预览界面效果
    2. 提高界面布局的复用率,如:一个页面布局可以被多处代码复用
    3. 提高后台逻辑代码的利用率,如:不同的页面布局可以使用同一段java代码来实现相同的逻辑处理

3.2 完整的页面创建过程包括三个步骤:

  1. 在 layout 目录下创建 XML 文件
  2. 创建与 XML 文件对应的 Java 代码
  3. 在 AndroidManifest.xml 中注册页面配

3.3 XML标记描绘应用界面

<?xml version="1.0" encoding="utf-8"?>
<!-- 线性布局, match_parent意思是与上级视图保持一致-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:gravity="center"
	android:orientation="vertical">
	<!-- 文本视图,名字叫做tv,显示的文字内容为“Hello World!” -->
	<!--android:id="@+id/tv",表示给该文本视图起名字编号-->
	<TextView
	    android:id="@+id/tv"
	    android:layout_height="wrap_content"
	    android:layout_width="wrap_content"
	    android:text="Hello World!" />
</LinearLayout>
  • 上面的XML内容,外层的LinearLayout标签为该界面的根节点,内层的TextView为控件节点。由于根节点和布局节点都存在下级节点,因此它们要有配对的标签头与标签尾,才能将下级节点包裹起来。
  • 根节点其实是特殊的布局节点,它的标签名称可以跟布局节点一样,区别之处在于下列两点:
    1. 每个界面只有一个根节点,却可能有多个布局节点,也可能没有中间的布局节点,此时所有控件节点都挂在根节点下面。
    2. 根节点必须配备xmlns:android="http://schemas.android.com/apk/res/android",表示指定XML内部的命名空间,有了这个命名空间,Android Studio会自动检查各节点的属性名称是否合法

3.4 Java代码书写程序逻辑

  • 复杂的业务逻辑由后台的代码实现,
public class MainActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}
  • 注意:onCreate内部的setContentView方法直接引用了布局文件的名字activity_main,该方法的意思是往当前活动界面填充activity_main.xml的布局内容
  • 在MainActivity中修改文本内容
public class MainActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//当前的页面布局采用的是res/layout/activity_main.xml
		setContentView(R.layout.activity_main);
		//获取名叫tv的TextView控件,注意添加导包语句importandroid.widget.TextView;
		TextView tv = findViewById(R.id.tv);
		//设置TextView控件的文字内容
        tv.setText("你好 Android!");
	}
}

在这里插入图片描述

3.5 App的活动页面

  • App活动页面的基本操作,首先手把手地分三步创建新的App页面,接着通过活动创建菜单快速生成页面源码,然后说明了如何在代码中跳到新的活动页面

3.5.1 创建新的App页面

  • 若要增加新的页面,,完整的页面创建过程包括3个步骤:创建XML文件、创建Java代码、注册页面配置
  1. 创建XML文件
    • 在Android Studio左上方找到项目结构图,右击res目录下面的layout
      在这里插入图片描述
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/text"
            />
    
    </LinearLayout>
    
  2. 创建Java代码
    import android.os.Bundle;
    import android.view.Menu;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    
    public class MainActivity2 extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //加载来自activity_main3的页面布局
            setContentView(R.layout.activity_main3);
        }
    }
    
  3. 注册页面配置
    • 在项目中注册该页面,打开AndroidManifest.xml,在application节点内进行配置:
    <activity android:name="MainActivity2" />
    

3.5.2 快速生成页面源码

  • Android Studio早已集成快速创建页面的功能,只要一个对话框就能完成所有操作。【创建XML文件、创建Java代码、注册页面配置】
  • 右击java目录下面的包名,右键菜单中依次选择New→Activity→Empty Activity
    在这里插入图片描述
    在这里插入图片描述

3.5.3 跳转页面的实现

  • 一旦创建好新页面,就得在合适的时候跳到该页面,假设出发页面为A,到达页面为B,那么跳转动作是从A跳到B。由于启动App会自动打开默认主页MainActivity,因此跳跃在MainActivity,跳跃的终点则为目标页面的Activity。这种跳转动作翻译为Android代码,格式形如"startActivity(newIntent(源页面.this, 目标页面.class));"。如果目标页面名为MainActivity2,跳转代码如下:
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.tv);
        tv.setText("你好 Android!");

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Intent intent = new Intent();
                //intent.setClass(MainActivity.this,MainActivity2.class);
                //startActivity(intent);
                startActivity(new Intent(MainActivity.this,MainActivity2.class));
            }
        });
    }
}

在这里插入图片描述

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

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

相关文章

科研试剂供应Pyrene-PEG3-Propargyl,芘甲酰胺-三聚乙二醇-丙炔

Pyrene-PEG3-Propargyl&#xff0c;Propargyl-PEG3-Pyrene&#xff0c;芘甲酰胺-三聚乙二醇-丙炔&#xff0c;芘甲酰胺三聚乙二醇丙炔反应特点&#xff1a;Pyrene-PEG3-Propargyl属于炔基点击试剂&#xff0c;点击化学的概念对化学合成领域有很大的贡献&#xff0c;在药 物开发…

nvdiffrast

nvidiffrast主页https://arxiv.org/pdf/2011.03277.pdfhttps://github.com/NVlabs/nvdiffrast CSC2547 Differentiable Rendering A Survey https://www.youtube.com/watch?v7LU0KcnSTc4 DR https://blog.qarnot.com/an-overview-of-differentiable-rendering/ 知乎 https:…

找不到工作的测试员一大把,大厂却招不到优秀软件测试员?高薪难寻测试工程师。

测试工程师招了快一个月了&#xff0c;实在招不到合适的&#xff0c;已经在被解雇的边缘了。。。” 初级测试工程师非常多&#xff0c;但真正掌握测试思维、能力强的优秀测试太少了&#xff01; 据我所知&#xff0c; 当下的测试人员不少状态都是这样的&#xff1a; 在工作中…

设计模式C++实现18:迭代器模式(Iterator)

意图&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。 上下文&#xff1a;集合对象内部结构常常变化各异。对于这些集合对象&#xff0c;能否在不暴露其内部结构的同时&#xff0c;让外部Client透明地访问其中包含的元素…

动态规划(楼梯和股票问题)

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录动态规划&…

抓包工具Charles(一)-下载安装与设置

无论是在测试、开发工作中&#xff0c;抓包都是很重要、很常用的技能。Charles作为一款抓包工具&#xff0c;能够满足大部分的工作需求。 文章目录一、下载地址二、安装三、安装根证书&#xff08;电脑&#xff09;四、设置五、抓包附录&#xff1a;[零基础入门接口功能测试教程…

<JVM上篇:内存与垃圾回收篇>10 - StringTable

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录10.1. String 的基本特性10.1.1. String 在 jdk9 中存储结构变更MotivationDescription10.1.2. String 的基本特性10.2. String 的内…

ARMv8 同步和信号量(Synchronization and semaphores)简介

目录 1&#xff0c;Load-Exclusive/Store-Exclusive 概述 2&#xff0c;独占式访问指令与非共享内存( Exclusive access instructions and Non-shareable memory locations) 3&#xff0c;独占式访问指令与共享内存( Exclusive access instructions and shareable memory lo…

文华财经期货波段趋势K线结构主图阶梯公式源码,极品多空红绿轨道指标公式

期货指标公式是通过数学逻辑角度计算而来&#xff0c;仅是期货分析环节中的一个辅助工具。期货市场具有不确定性和不可预测性的&#xff0c;请正常对待和使用指标公式! 第一步&#xff1a;判大势 所谓判大势&#xff0c;就是判断当前行情趋势&#xff0c;是入场前的必备步骤。…

中汽协确认参加2023EVH新能源动力总成年会

演讲主题&#xff1a;中国汽车工业经济运行情况 演讲大纲&#xff1a; 对中国汽车工业近期发展态势进行分析2023年汽车行业预测 陈士华 现任中国汽车工业协会副秘书长&#xff0c;兼任中国汽车工业经济技术信息研究所有限公司总经理 1999年3月至今&#xff0c;就职于中国汽…

接口自动化测试框架(Java 实现)

需求分析 需求点需求分析通过 yaml 配置接口操作和用例后续新增接口和测试用例只需要编写 yaml 文件即可实现。可以支持接口间的参数传递具有参数依赖的接口可以进行变量的抽取和参数赋值。支持全局、用例维度的变量存储比如时间截命名法中要用到的时间截后缀。支持用例软断言…

Go语言入门【10】Map

Map map是一种键值对形式的数据结构&#xff0c;一个键对应一个值&#xff0c;可以通过键快速检索出其对应的value值&#xff0c;在map中key的值是唯一的&#xff0c;value的值不唯一&#xff0c;并且map中保存的数据是无序的。 Map声明 声明Map可以使用map关键字进行声明&a…

【Yolov7】配置参数以及训练模型

一、下载Yolov7 github地址&#xff1a;https://github.com/WongKinYiu/yolov7 或者命令行下载 git clone https://github.com/WongKinYiu/yolov7.git二、新建一个Python环境 用Acaconda新建一个干净的环境&#xff0c;我命名为yolov7&#xff0c;python版本选择3.8 进入到…

GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)

&#x1f604; 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构训练范式实验。 文章目录1、GPT1.1、模型结构&#xff1a;1.2、范式&#xff1a;预训练 finetune1.3、实验部分:2、GPT-22.1、模型结构2.2、范式&#xff1a;预…

C语言运算符(左值右值,基本运算符)

一.数据对象&#xff0c;左值&#xff0c;右值&#xff0c;运算符 数据对象&#xff1a;用于存储值的数据存储区域统称&#xff0c;而使用变量名是标识对象的一种方法&#xff08;还有指针&#xff0c;后面会教的&#xff09; 左值&#xff1a;用于标识特定数据对象的名称或表…

图的总复习

一、图的定义Graph 图是由顶点vertex集合及顶点间关系集合组成的一种数据结构&#xff1a; 顶点的集合 和 边的集合 二、无向图 用&#xff08;x,y&#xff09;表示两个顶点x和y之间的一条边&#xff08;edge&#xff09; 边是无方向的 N{V&#xff0c;E}&#xff0c;V{0…

【学习总结】2023寒假总结

写在前面时光匆匆&#xff0c;白驹过隙&#xff0c;转眼间寒假就过去了&#xff0c;这次寒假可以算的上是最长的一次假期&#xff0c;经历了从疫情到放开&#xff0c;从患病到阳康&#xff0c;在现实与虚幻的世界中玩耍&#xff0c;在痛苦的数据结构中徘徊&#xff0c;在每次早…

FFMPEG自学一 音视频解封装

一、音视频包含哪些数据对于一个mp4文件我们可以通过音视频分析软件打开查看内部信息。从两图可以看出mp4文件一般包含 音频流 视频流等。对于上面的字段大致分析如下Format编码方式AVC现在大部分视频都是这种编码方式&#xff0c;即H264。CodecId编码器idavc1H264封装有2种格式…

(二)随处可见的LED广告屏是怎么工作的呢?代码实现

书接上回&#xff0c;上一篇中我们聊到了LED点阵屏的工作原理和一些电气参数。本篇以第一篇为基础&#xff0c;对软件层面进行展开&#xff0c;同时也为下一篇接入GUI做铺垫。文章较第一篇有所增长&#xff0c;大概需要5~7分钟可以看完。【目标】能够随心所欲的显示我们想要的图…

OpenWrt之IPv6设置详解

文章目录前言网络结构1. WAN口设置2. LAN口设置3. NAT6配置4. 接口状态5. 网站测试6. 关于端口放行后话前言 最近电信终于肯下发v6的地址了, 得为路由器配置一下了, 之前一直是处于关闭的状态, 今天重新设置回去. 从此有了v4与v6双公网地址. 网络结构 光猫设置为桥接路由器设…