第一行代码:Android(2nd ed)(13):开始启程——你的第一行 Android 代码 1.3.4

阅读数:21 2019 年 10 月 19 日 13:27

第一行代码:Android(2nd ed)(13):开始启程——你的第一行Android代码 1.3.4

(创建你的第一个 Android 项目:分析你的第一个 Android 程序)

回到 Android Studio 当中,首先展开 HelloWorld 项目,你会看到如图 1.26 所示的项目结构。

第一行代码:Android(2nd ed)(13):开始启程——你的第一行Android代码 1.3.4

图 1.26 Android 模式的项目结构

任何一个新建的项目都会默认使用 Android 模式的项目结构,但这并不是项目真实的目录结构,而是被 Android Studio 转换过的。这种项目结构简洁明了,适合进行快速开发,但是对于新手来说可能并不易于理解。点击图 1.26 当中的 Android 区域可以切换项目结构模式,如图 1.27 所示。

第一行代码:Android(2nd ed)(13):开始启程——你的第一行Android代码 1.3.4

图 1.27 切换项目结构模式

这里我们将项目结构模式切换成 Project,这就是项目真实的目录结构了,如图 1.28 所示。

第一行代码:Android(2nd ed)(13):开始启程——你的第一行Android代码 1.3.4

图 1.28 Project 模式的项目结构

一开始看到这么多陌生的东西,你一定会感到有点头晕吧。别担心,我现在就对图 1.28 中的内容进行一一讲解,之后你再看这张图就不会感到那么吃力了。

  1. .gradle 和.idea

这两个目录下放置的都是 Android Studio 自动生成的一些文件,我们无须关心,也不要去手动编辑。

  1. app

项目中的代码、资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的,待会儿还会对这个目录单独展开进行讲解。

  1. build

这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件。

  1. gradle

这个目录下包含了 gradle wrapper 的配置文件,使用 gradle wrapper 的方式不需要提前将 gradle 下载好,而是会自动根据本地的缓存情况决定是否需要联网下载 gradle。Android Studio 默认没有启用 gradle wrapper 的方式,如果需要打开,可以点击 Android Studio 导航栏→File→Settings→Build, Execution, Deployment→Gradle,进行配置更改。

  1. .gitignore

这个文件是用来将指定的目录或文件排除在版本控制之外的,关于版本控制我们将在第 5 章中开始正式的学习。

  1. build.gradle

这是项目全局的 gradle 构建脚本,通常这个文件中的内容是不需要修改的。稍后我们将会详细分析 gradle 构建脚本中的具体内容。

  1. gradle.properties

这个文件是全局的 gradle 配置文件,在这里配置的属性将会影响到项目中所有的 gradle 编译脚本。

  1. gradlew 和 gradlew.bat

这两个文件是用来在命令行界面中执行 gradle 命令的,其中 gradlew 是在 Linux 或 Mac 系统中使用的,gradlew.bat 是在 Windows 系统中使用的。

  1. HelloWorld.iml

iml 文件是所有 IntelliJ IDEA 项目都会自动生成的一个文件(Android Studio 是基于 IntelliJ IDEA 开发的),用于标识这是一个 IntelliJ IDEA 项目,我们不需要修改这个文件中的任何内容。

  1. local.properties

这个文件用于指定本机中的 Android SDK 路径,通常内容都是自动生成的,我们并不需要修改。除非你本机中的 Android SDK 位置发生了变化,那么就将这个文件中的路径改成新的位置即可。

  1. settings.gradle

这个文件用于指定项目中所有引入的模块。由于 HelloWorld 项目中就只有一个 app 模块,因此该文件中也就只引入了 app 这一个模块。通常情况下模块的引入都是自动完成的,需要我们手动去修改这个文件的场景可能比较少。

现在整个项目的外层目录结构已经介绍完了。你会发现,除了 app 目录之外,大多数的文件和目录都是自动生成的,我们并不需要进行修改。想必你已经猜到了,app 目录下的内容才是我们以后的工作重点,展开之后结构如图 1.29 所示。

第一行代码:Android(2nd ed)(13):开始启程——你的第一行Android代码 1.3.4

图 1.29 app 目录下的结构

那么下面我们就来对 app 目录下的内容进行更为详细的分析。

  1. build

这个目录和外层的 build 目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容会更多更杂,我们不需要过多关心。

  1. libs

如果你的项目中使用到了第三方 jar 包,就需要把这些 jar 包都放在 libs 目录下,放在这个目录下的 jar 包都会被自动添加到构建路径里去。

  1. androidTest

此处是用来编写 Android Test 测试用例的,可以对项目进行一些自动化测试。

  1. java

毫无疑问,java 目录是放置我们所有 Java 代码的地方,展开该目录,你将看到我们刚才创建的 HelloWorldActivity 文件就在里面。

  1. res

这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在 drawable 目录下,布局放在 layout 目录下,字符串放在 values 目录下,所以你不用担心会把整个 res 目录弄得乱糟糟的。

  1. AndroidManifest.xml

这是你整个 Android 项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。由于这个文件以后会经常用到,我们用到的时候再做详细说明。

  1. test

此处是用来编写 Unit Test 测试用例的,是对项目进行自动化测试的另一种方式。

  1. .gitignore

这个文件用于将 app 模块内的指定的目录或文件排除在版本控制之外,作用和外层的.gitignore 文件类似。

  1. app.iml

IntelliJ IDEA 项目自动生成的文件,我们不需要关心或修改这个文件中的内容。

  1. build.gradle

这是 app 模块的 gradle 构建脚本,这个文件中会指定很多项目构建相关的配置,我们稍后将会详细分析 gradle 构建脚本中的具体内容。

  1. proguard-rules.pro

这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。

这样整个项目的目录结构就都介绍完了,如果你还不能完全理解的话也很正常,毕竟里面有太多的东西你都还没接触过。不过不用担心,这并不会影响到你后面的学习。等你学完整本书再回来看这个目录结构图时,你会觉得特别地清晰和简单。

接下来我们一起分析一下 HelloWorld 项目究竟是怎么运行起来的吧。首先打开 AndroidManifest.xml 文件,从中可以找到如下代码:

复制代码
<activity android:name=".HelloWorldActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

这段代码表示对 HelloWorldActivity 这个活动进行注册,没有在 AndroidManifest.xml 里注册的活动是不能使用的。其中intent-filter里的两行代码非常重要,<action android:name= "android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />表示 HelloWorldActivity 是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。

那 HelloWorldActivity 具体又有什么作用呢?我在介绍 Android 四大组件的时候说过,活动是 Android 应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。因此你在图 1.24 中看到的界面,其实就是 HelloWorldActivity 这个活动。那我们快去看一下它的代码吧,打开 HelloWorldActivity,代码如下所示:

复制代码
public class HelloWorldActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_world_layout);
}
}

首先我们可以看到,HelloWorldActivity 是继承自 AppCompatActivity 的,这是一种向下兼容的 Activity,可以将 Activity 在各个系统版本中增加的特性和功能最低兼容到 Android 2.1 系统。Activity 是 Android 系统提供的一个活动基类,我们项目中所有的活动都必须继承它或者它的子类才能拥有活动的特性(AppCompatActivity是 Activity 的子类)。然后可以看到 HelloWorldActivity 中有一个onCreate()方法,这个方法是一个活动被创建时必定要执行的方法,其中只有两行代码,并且没有 Hello World! 的字样。那么图 1.24 中显示的 Hello World! 是在哪里定义的呢?

其实 Android 程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。可以看到,在onCreate()方法的第二行调用了setContentView()方法,就是这个方法给当前的活动引入了一个 hello_world_layout 布局,那 Hello World! 一定就是在这里定义的了!我们快打开这个文件看一看。

布局文件都是定义在 res/layout 目录下的,当你展开 layout 目录,你会看到 hello_world_layout.xml 这个文件。打开该文件并切换到 Text 视图,代码如下所示:

复制代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/hello_world_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.helloworld.HelloWorldActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>

现在还看不懂?没关系,后面我会对布局进行详细讲解的,你现在只需要看到上面代码中有一个 TextView,这是 Android 系统提供的一个控件,用于在布局中显示文字的。然后你终于在 TextView 中看到了 Hello World! 的字样!哈哈!终于找到了,原来就是通过android:text="Hello World!"这句代码定义的。

这样我们就将 HelloWorld 项目的目录结构以及基本的执行过程都分析完了,相信你对 Android 项目已经有了一个初步的认识,下一小节中我们就来学习一下项目中所包含的资源。

评论

发布