Android的官方编程语言包括Java和Kotlin,如果想学好Kotlin必须要有良好的Java语言基础。Kotlin文件可以调Java文件,Java文件也可以调用Kotlin文件。
不管是Java还是Kotlin,它们都属于解释型语言,这类语言在运行之时才将程序翻译成机器语言,故而执行效率偏低。虽然现在手机配置越来越高,大多数场景的App运行都很流畅,但是涉及图像与音视频处理等复杂运算的场合,解释型语言的性能瓶颈便暴露出来。
编译型语言在首次编译时就将代码编译为机器语言,后续运行无须重新编译,直接使用之前的编译文件即可,因此执行效率比解释型语言高。
C/C++正是编译型语言的代表,它能够有效弥补解释型语言的性能缺憾,借助于Java Native Interface技术,Java代码允许调用C/C++编写的程序。事实上,Android的SDK开发包内部定义了许多JNI接口,包括图像读写在内的底层代码均由C/C++编写,再由外部通过封装好的Java方法调用。
Android的布局文件使用XML来写,它是一种命令式的UI。
XML全称Extensible Markup Language,即可扩展性标记语言,严格来说,XML并非编程语言,只是一种标记语言。它类似于HTML,利用各种标签表示页面元素,以及各元素之间的层级关系及其排列组合。
每个XML标签都是独立的控件对象,标签内部的属性以“android:”打头,表示这是标准的安卓属性,各属性分别代表控件的某种规格。
Java编程是通过JDBC连接数据库进行增删改查,这个数据库可能是MySQL,也可能是Oracle,还可能是SQL Server。
问题1:企业数据库无法在手机上安装,那么App怎样管理业务方面的数据记录?
Android内置了专门的数据库名为SQLite,它遵循关系数据库的设计理念,SQL语法类似于MySQL。不同之处在于,SQLite无须单独安装,因为它内嵌到应用进程当中,所以App无需配置连接信息,即可直接对其增删改查。由于SQLite嵌入到应用程序,省去了配置数据库服务器的开销,因此它又被归类为嵌入式数据库。
问题2:SQLite的数据库文件保存在手机上,开发者拿不到用户的手机,又该如何获取App存储的业务数据?
手机端的App,连同程序代码及其内置的嵌入式数据库,其实是个又独立又完整的程序实体,它只负责手机上的用户交互与信息处理,该实体被称作客户端。
而后端的Java Web服务,包括Web代码和数据库服务器,同样构成另一个独立运行的程序实体,它只负责后台的业务逻辑与数据库操作,该实体被称作服务端。
客户端与服务端之间通过HTTP接口通信,每当客户端觉得需要把信息发给服务端,或者需要从服务端获取信息时,客户端便向服务端发起HTTP请求,服务端收到客户端的请求之后,根据规则完成数据处理,并将处理结果返回给客户端。这样客户端经由HTTP接口并借服务器之手,方能间接读写后端的数据库服务器。
App工程分为两个层次,第一个层次是项目,另一个层次是模块。
模块依赖于项目,每个项目至少有一个模块,也能拥有多个模块。
一般所言的“编译运行App”,指的是运行某个模块,而非运行某个项目,因为模块才对应实际的App。
App的工程目录结构有两个分类(左上角Android视图下),一个是app(代表app模块);另一个是Gradle Scripts。
app下的3个子目录:
注:矢量图放大后不会失真,位图会。
Gradle Scripts是工程的编译配置文件,主要有:
注:
Project级别就是工程级别的,全局的;Module级别就是模块级别的,局部的
例如:
项目级别的build.gradle指定了当前项目的总体编译规则
模块级别的build.gradle对应于具体模块,每个模块都有自己的build.gradle,它指定了当前模块的详细编译规则
plugins {
id 'com.android.application'
}
android {
namespace 'com.example.experiment01'
//指定编译用的SDK版本号,对应的有Android的版本号
compileSdk 34
defaultConfig {
//指定该模块的应用编号,也就是app的包名,是应用的唯一身份标识
//要和清单文件中manifest标签的package属性保持一致
applicationId "com.example.experiment01"
//指定App适合运行的最小SDK版本号,
minSdk 26
//指定目标设备的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 {
//指定编译Android的高版本支持库,如AppCompatAcitivity必须指定编译appcompat库
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.10.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
//指定单元测试编译用的junit版本号
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
注:Gradle工具的版本配置在gradle\wrapper\gradle-wrapper.properties,每个版本的Android Studio都有对应的Gradle版本,只有二者的版本正确对应,App工程才能正确编译。
每个应用的根目录下都必须包含一个AndroidManifest.xml,并且文件名必须一模一样。
这个文件中包含了APP的配置信息,系统需要根据里面的内容运行APP的代码,显示页面。
根节点manifest下面的application节点的属性说明如下:
application下面的activity节点(activity是包含可执行操作的界面),是活动页面的注册声明,只有在AndroidManifest.xml中正确配置了activity节点,才能在运行时访问对应的活动页面。
初始配置的MainActivity正是App的默认主页,它的节点内部还配置两种必备的过滤规则。
<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>
利用XML标记描绘应用界面,使用Java代码书写程序逻辑
问题1:这种界面设计与逻辑处理分开的好处?
使用XML文件描述APP界面,可以很方便地在Android Studio上预览界面效果。
一个界面布局可以被多处代码复用,一个Java代码也可能适配多个界面布局。
注:xmlns也就是xml namespace,指明了该节点下哪些属性可用。
完整的页面创建过程包括三个步骤: