开发Android程序需要的工具
- JDK。JDK是Java 语言的软件开发工具包。它包含了Java 的运行环境、工具集合、基础类库等内容。需要注意的是,本书中的Android程序必须使用JDK 8 或以上版本才能进行开发。
- Android SDK。Android SDK 是谷歌提供的Android 开发工具包。在开发Android 程序时,需要引入该工具包,来使用Android 相关的API。
- Android Studio。开发工具。早期用Eclipse + ADT插件。
官网下载地址: https://developer.android.google.cn/studio/index.html
创建Android项目
在Android Studio的欢迎界面点击 Start a New Android Studio project,会打开一个创建新项目的界面。
其中 Application name 表示应用名称,应用安装到手机之后会在手机上显示该名称。Company Domain 表示公司域名。Package name 表示项目的包名,Android系统就是通过包名来区分不同的应用程序的,因此包名一定要具有唯一性。Project location 表示项目代码存放的位置。Minimum SDK 设置项目的最低兼容版本。
运行Android 项目。
观察Android Studio 顶部工具栏中的图标,其中左边的锤子按钮是用来编译项目的,中间的下拉列表是用来选择运行哪一个项目的。右边的三角形按钮是用来运行项目的。
项目结构
任何一个新建的项目,都会默认使用Android 模式的项目结构,但这不是项目真实的目录结构,而是被Android Studio 转换过的。这种项目结构简单明了,适合进行快速开发,但是对于新手来说可能并不易于理解。点击Android区域可以切换项目结构模式。将项目结构模式切换成Project,这就是项目真实的目录结构了。
- .gradle 和 .idea
这两个目录下放置的都是Android Studio 自动生成的一些文件,无需手动编辑。 - app
项目中的代码、资源等内容几乎都是放置在这个目录下的。 - build
这个目录主要包含了一些在编译时自动生成的文件。 - gradle
这个目录下包含了gradle wrapper 的配置文件。Android Studio 默认没有启用gradle wrapper 的方式,可以点击 Android Studio 导航栏 — File — Settings — Build, Execution, Deployment — Gradle, 进行配置更改。 - .gitignore
这个文件是用来将指定的目录或文件排除在版本控制之外的。 - build.gradle
项目全局的gradle构建脚本。 - gradle.properties
全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。 - gradlew 和 gradlew.bat
这两个文件是用来在命令行界面中执行gradle命令的,其中gradlew 是在Linux 或Mac 系统中使用的,gradlew.bat 是在Windows 系统中使用的。 - HelloWorld.iml
iml 文件是所有 Intellij IDEA 项目都会自动生成的一个文件(Android Studio 是基于 Intellij IDEA 开发的),用于标识这是一个 Intellij IDEA 项目,不需要修改这个文件中的任何内容。 - local.properties
用于指定本机中的 Android SDK 路径,通常内容都是自动生成的, 并不需要修改。 - settings.gradle
用于指定项目中所有引入的模块。通常情况下模块的引入都是自动完成的。
app 目录结构
- build
这个目录和外层的build 目录类似,主要也是包含了一些在编译时自动生成的文件,不过里面的内容会更加复杂。 - libs
如果项目中使用到了第三方jar 包,就需要把这些jar 包都放在libs 目录下。 - androidTest
此处是用来编写Android Test 测试用例的,可以对项目进行一些自动化测试。 - java
java 目录是放置所有java 代码的地方。 - res
在项目中使用的所有图片、布局、字符串等资源都存放在这个目录下。图片放在drawable 目录,布局放在layout 布局,字符串放在values 目录。 - AndroidManifest.xml
Android 项目的配置文件,在程序中定义的四大组件需要在这个文件里注册,还可以在这个文件中给应用程序添加权限声明。 - test
此处是用来编写Unit Test 测试用例的,是对项目进行自动化测试的另一种方式。 - .gitignore
用于将app 模块内的指定目录或文件排除在版本控制之外,作用和外层的.gitignore 文件类似。 - app.iml
Intellij IDEA 项目自动生成的文件。 - build.gradle
app模块的gradle构建脚本,指定很多项目构建相关的配置。 - proguard-rules.pro
用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。
HelloWorld
- AndroidManifest.xml
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这段代码表示对MainActivity 这个活动进行注册,没有在AndroidManifest.xml 里注册的活动是不能使用的。其中intent-filter 里的两行代码 <action android:name=“android.intent.action.MAIN” /> 和 <category android:name=“android.intent.category.LAUNCHER” /> 表示MainActivity 是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。
- MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
}
}
MainActivity 是继承AppCompatActivity 的,这是一种向下兼容的Activity,可以将Activity 在各个系统版本中增加的特效和功能最低兼容到Android 2.1 系统。Activity 是Android 系统提供的活动基类,项目中所有的活动都必须继承它或者它的子类才能拥有活动的特性(AppCompatActivity 是 Activity 的子类)。onCreate() 方法是一个活动被创建时必定要执行的方法。setContentView() 方法给当前的活动引入了一个activity_main 布局。
Android 程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的,更加通用的做法是,在布局文件中编写界面,然后在活动中引入进来。
- activity_main.xml
布局文件都是定义在 res/layout 目录下的。打开该文件并切换到Text视图,代码如下:
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_heigh="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_contraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
TextView 是Android 系统提供的一个控件,用于在布局中显示文字。通过android.text=“Hello World!” 定义文字内容。
项目中的资源
res目录,所有以drawable开头的文件夹都是用来放图片的(?),所有以mipmap开头的文件夹都是用来放应用图标的,所有以values开头的文件夹都是用来放字符串、样式、颜色等配置的,layout文件夹是用来放布局文件的。
之所以有这么多mipmap开头的文件夹,其实主要是为了让程序能够更好地兼容各种设备。drawable文件夹也是相同的道理,虽然Android Studio没有帮我们自动生成,但是我们应该自己创建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等文件夹。(?)在制作程序的时候最好能够给同一张图片提供几个不同分辨率的版本,分别放在这些文件夹下,当程序运行的时候,会自动根据当前设备分辨率的高低选择加载哪个文件夹下的图片。
打开res/values/strings.xml 文件
<resources>
<string name="app_name">HelloWorld</string>
</resources>
这里定义了一个应用程序名的字符串,有以下两种方式来引用它:
在代码中通过R.string.app_name 可以获得该字符串的引用。
在XML中通过@string/app_name 可以获得该字符串的引用。
其中string部分是可以替换的,如果是应用的图片资源,可以替换成drawable,如果是引用的应用图标就可以替换成mipmap,如果是引用的布局文件就可以替换成layout,以此类推。
打开AndroidManifest.xml 文件,找到如下代码:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
</application>
其中,HelloWorld项目的应用图标就是通过android:icon 属性来指定的,应用的名称则是通过android:label 属性指定的。
详解build.gradle 文件
不同于Eclipse,Android Studio 是采用Gradle 来构建项目的。Gradle 是一个非常先进的项目构建工具,它使用了一种基于Groovy 的领域特定语言(DSL)来申明项目设置,摒弃了传统基于XML(如Ant 和 Maven)的各种繁琐配置。
最外层目录下的build.gradle 文件
buildscript{
repositories{
google()
jcenter()
}
dependencies{
classpath 'com.android.tools.build:gradle:3.5.3'
}
}
allprojects{
repositories{
google()
jcenter()
}
}
task clean(type:Delete){
delete rootProject.buildDir
}
这些代码都是自动生成的。两处repositories 的闭包中都声明了jcenter() 这行配置,它是一个代码托管仓库,很多Android 开源项目都会选择将代码托管到jcenter 上,声明了这行配置之后,就可以在项目中轻松引用任何jcenter 上的开源项目。
dependencies 闭包中使用classpath 声明了一个Gradle 插件。因为Gradle 并不是专门为构建Android 项目而开发的,Java、C++等很多种项目都可以使用Gradle 来构建,因此构建Android 项目需要声明com.android.toos.build:gradle:3.5.3 这个插件,最后面的部分是插件的版本号。
app目录下的build.gradle 文件
apply plugin:'com.android.application'
android{
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "com.example.helloworld"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionVersion "1.0"
}
buildTypes{
release{
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
}
dependencies{
compile fileTree(dir:'libs', include:['*.jar'])
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}
第一行应用了一个插件,一般有两种值可选:com.android.application 表示这是一个应用程序模块,com.android.library 表示这是一个库模块。应用程序模块和库模块最大的区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
compileSdkVersion 用于指定项目的编译版本,24表示使用Android7.0系统的SDK,buildToolVersion 用于指定项目构建工具的版本。
applicationId 用于指定项目的包名,minSdkVersion 用于指定项目最低兼容的Android 系统版本,targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说Android 6.0 系统中引入了运行时权限,如果将targetSdkVersion 指定成23或更高,系统就会启用运行时权限功能,如果将targetSdkVersion 指定成22,就说明你的应用程序最高只在Android 5.1 系统上做过充分的测试,Android 6.0 系统中引用的新功能不会启用。versionCode 用于指定项目的版本号,versionName 用于指定项目的版本名。
buildTypes 闭包用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,用于指定生成测试版安装文件的配置,一个是release,用于指定生成正式版安装文件的配置。debug 闭包是可以忽略不写的。minifyEnble 用于指定是否对项目的代码进行混淆,true 表示混淆,false 表示不混淆。proguardFiles 用于指定混淆时使用的规则文件,这里指定了两个混淆文件,第一个proguard-android.txt 是在Android SDK 目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro 是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。
dependencies 闭包指定当前项目所有的依赖关系 。通常Android Studio 有3种依赖方式:本地依赖、库依赖和远程依赖。本地依赖可以对本地的Jar 包或目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖则可以对jcenter 库上的开源项目添加依赖关系。第一行的 compile fileTree 就是一个本地依赖声明,表示将libs 目录下所有.jar 后缀的文件都添加到项目的构建路径当中。第二行的compile 则是远程依赖声明,com.android.support:appcompat-v7:24.2.1 就是一个标准的远程依赖库格式。其中com.android.support 是域名部分,用于和其它公司的库做区分,appcomt-v7 是组名称,用于和同一个公司中不同的库做区分,24.2.1 是版本号,用于和同一个库的不同版本做区分。加上这句声明后,Gradle 在构建项目时,会首先检查一下本地是否已经有这个库的缓存,如果没有则会自动联网下载,然后再添加到项目的构建路径当中。库依赖,基本格式是 compile project 后面加上要依赖的库名称,比如一个库模块的名字叫helper,那么添加这个库的依赖关系只需要加入 compile project(’:helper’) 这句声明。testCompile 是用于声明测试用例库的。