2 Android APP开发基础
2.1APP开发的特点
XML:extensible markup language,可标记扩展语言。严格来说XML并非语言,只是一种标记语言。类似于HTML,利用各种标签表达页面元素,以及各元素之间的层级关系及其排列组合。
SQLite:内嵌到了应用程序中,无需配置数据库服务器,被归类为嵌入式数据库
手机APP能直接操作内置的SQLite数据库,但不能直接操作MYSQL这种企业数据库。必须事先搭好服务端程序(如Java Web),然后客户端与服务端通过HTTP接口通信,再由服务端去操作MYSQL这样的数据库服务器。
2.2 APP的工程结构
项目与模块的区别
工程内部各目录与配置文件的用途说明
阐述两种级别的编译配置文件build、gradle,及内部的配置信息说明
运行配置文件AndroidManifest.xml的节点信息及其属性说明
2.2.1 APP工程目录结构
项目-模块
每个项目至少一个模块,也可以多个模块。
编译运行app指某个模块,而非某个项目,因为模块才对应实际的app
2.2.2 编译配置文件build.grade
Project(项目)级别的build.gradle学习
从AndroidStudioBumblebee开始,项目级别的build.gradle不再存放仓库地址,而是将仓库地址的repositories节点配置到了settings.gradle。因此要在settings.gradle中补充如下的阿里云仓库地址:
//从Android StudioBumblebee开始,项目级别的build.gradle不再存放仓库地址,
//而是将仓库地址的repositories节点配置到了settings.gradle。
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
//以下4行添加阿里云的仓库地址,方便国内开发者下载相关插件
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'}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
//以下4行添加阿里云的仓库地址,方便国内开发者下载相关插件
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'}
}
}
rootProject.name = "My Application"
include ':app'
Module(模块)级别的build.gradle学习
//build.gradle(Module: My _Application.app):模块级别的build.gradle
//每个模块都有自己的build.gradle,指定了当前模块的详细编译规则。
//为什么文件扩展名是.gradle? 因为他们采用了gradle工具完成编译构建操作。
//Gradle工具的版本配置在gradle-wrapper.properties
//这段代码用于声明这是一个Android应用模块,用于让Gradle识别 Android 项目的特殊结构(如res/目录),并使用android{ ... }配置块
plugins {
id 'com.android.application'
}
//android{ }是Android项目的核心配置块,主要配置:defaultConfig、buildTypes、productFlavors、compileOptions等
android {
//指定编译用的SDK版本号。比如30表示使用Android xx编译
compileSdk 30
defaultConfig {
//指定该模块的应用编号,即APP包名
applicationId "com.example.myapplication"
//指定app适合运行的最小SDK版本号。比如28表示至少在android xx上运行
minSdk 28
//指定目标设备的SDK版本号。表示APP最希望在哪个版本的android上运行
targetSdk 30
//指定APP的应用版本号
versionCode 1
//指定APP的应用版本名称
versionName "1.0"
//testInstrumentationRunner:一个Gradle配置项,用于声明Android仪器测试的运行器
//androidx.test.runner.AndroidJUnitRunner:这是AndroidX测试库提供的默认测试运行器,基于JUnit 4,用于提供 Android 环境
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
//buildTypes块:用于定义不同的构建类型(如 debug、release),每个类型可以有不同的构建配置
buildTypes {
//定义名为 release 的构建类型,专门用于生成正式发布的 APK。
//APK(Android Package Kit,文件扩展名 .apk)是 Android 应用程序的安装包文件
release {
//minifyEnabled false:是否启用代码压缩(删除无用代码)和混淆(重命名类/方法名,增加反编译难度,保护源代码)。
//false 表示禁用(默认在 release 中应设为 true 以优化 APK)。
//若启用,需配合 ProGuard/R8 规则(见下一行)
minifyEnabled false
//指定 ProGuard/R8 混淆规则文件:
//APK 可以被反编译(如使用 JADX、APKTool),容易暴露源代码逻辑。通过重命名类、方法、变量等标识符,并删除无用代码,使得反编译后的代码难以阅读和理解
//proguard-android-optimize.txt:Android 默认提供的优化规则(位于 Android SDK 中)。
//proguard-rules.pro:项目自定义规则(位于模块根目录)。
//若 minifyEnabled true,编译时会应用这些规则来混淆apk。
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//compileOptions块:配置 Java 源代码的编译选项,主要兼容性设置。
compileOptions {
//指定源代码的 Java 版本为 1.8(即支持 Lambda 表达式、Stream API 等 Java 8 特性)。
sourceCompatibility JavaVersion.VERSION_1_8
//指定生成的字节码兼容 Java 1.8,确保在 JVM 上运行时能正确调用 1.8 的特性
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
// AndroidX 核心兼容库,提供向后兼容的组件和 API,确保在新旧 Android 版本上行为一致。包含 Fragment、Activity 等基础组件。
implementation 'androidx.appcompat:appcompat:1.3.0'
// Google 的 Material Design 组件库,提供 Material 风格的 UI 控件(如按钮、卡片、导航栏等)
implementation 'com.google.android.material:material:1.4.0'
// 约束布局库,Android 推荐的灵活布局方式,替代 RelativeLayout,支持复杂的视图约束关系
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
// 单元测试框架 (JUnit 4),仅运行在本地 JVM,用于测试纯 Java/Kotlin 逻辑(不依赖 Android 环境)
testImplementation 'junit:junit:4.13.2'
// Android 扩展的 JUnit 测试库,运行在设备或模拟器上,提供 Android 环境相关的测试功能(如 Context 访问)
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
// Espresso 核心测试库,用于编写 UI 自动化测试(如模拟点击、验证界面内容)
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
AndroidManifest.xml文件学习:
xml文件中注释快捷键:ctrl+/
注意application下面还有个activity节点,它是活动页面的注册声明,只有在AndroidManifest.xml
中正确配置了activity节点,才能在运行时访问对应的活动页面。初始配置的MainActivity正是App
的默认主页,之所以说该页面是App主页,是因为它的activity节点内部还配置了以下的过滤信息:
<intent-filter>
<action android:name="android.intent.action.MAiN" />
<category android:name="android.intent.category.LAUNcHER" />
</intent-filter>
其中action节点设置的android.intent.action.MAIN表示该页面是App的入口页面,启动App时会
最先打开该页面。而category节点设置的android.intent.category.LAUNCHER决定了是否在手机屏幕
上显示App图标,如果同时有两个activity节点内部都设置了android.intent.category.LAUNCHER,那
么桌面就会显示两个App图标。以上的两种节点规则可能一开始不太好理解,读者只需记住默认主
页必须同时配置这两种过滤规则即可。
问题1:"Xml declaration should precede all document content" 报错。
解答:XML 声明必须位于文档的最前面,不能在任何其他内容(包括注释、空格或换行)之后出现,修改为以下:
<?xml version="1.0" encoding="utf-8"?>
<!--xml文件为配置文件-->
2.3 app的设计规范
app将看得见的界面设计与看不见的代码逻辑区分开,然后利用xml标记描绘应用界面,同时使用Java代码书写程序逻辑,从而形成app前后端分离的设计规约。
2.3.1界面设计与代码逻辑
app分为:用户看得到的界面(交给XML);用户看不到的app后台(交给后台Java代码)
前后端分离:即界面设计与代码逻辑分开。
新创建的app项目,默认首页布局为activity_main.xml