2.3 Android应用程序分析

Android应用开发建立在应用程序框架之上,开发简捷、方便,用户界面由XML担任,业务逻辑由Java程序完成,以实现界面设计和程序逻辑的分离,具有低耦合性和高重用性,可以让程序设计人员集中精力开发业务逻辑,界面设计人员集中精力进行界面设计,这是符合MVC设计思想的,从而达到提高开发效率、缩减开发时间,降低开发成本的目的。

提示:MVC是一种设计模式,将一个应用划分为以下层面:M(Model,模型层):封装应用程序的业务逻辑和数据结构,负责数据的存取;V(View,视图层):它是模型层的外在表现,负责界面的显示;C(Controller,控制器层):将模型层和视图层联系到一起,确保模型层和视图层的同步,负责将数据写到模型层中并调用视图。

下面对第一个Android应用项目FirstAndroidApplication的程序进行解析。

我们关心第一个Android应用项目运行结果(如图2.8所示):界面和“Hello world!”从何而来?需要从访问源代码目录做起。

2.3.1 源代码文件

在Android应用项目目录src中存放的应用程序是Java源代码文件,自动地组织在用户声明的包内。

1.src目录

在应用项目FirstAndroidApplication的目录src/com.application.firstandroidapplication MainActivity.java文件中,重写onCreate()方法,调用父类的onCreate()方法,调用setContentView()方法,加载activity_main.xml布局文件。

在该文件中编辑代码如下:

(1)第1行至第12行,声明包package com.application.firstandroidapplication,引入有关类android.app.Activity等。

提示:Activity类是Android系统提供的一个活动基类,项目中所有活动需要继承它才能具有活动特性。

(2)第14行定义类MainActivity的开始,extends关键字表示MainActivity类继承自Activity类,在第3行引入。

提示:继承(Inheritance)可以实现代码的复用,被继承的类称为父类、基类或超类,由继承而得的类称为子类或导出类。子类继承父类的成员变量和成员方法,可以修改父类的成员变量或重写父类的方法,还可以添加新的成员变量和成员方法。

(3)第16行是Java源代码的单行注释。

(4)第17行@Override表示重写下一行紧跟的方法onCreate(),MainActivity类继承自Activity类,Activity类已定义onCreate()方法,重写onCreate()方法即重新定义MainActivity类自己的onCreate()方法,当程序运行时,就会执行MainActivity类自己的onCreate()方法里的代码。

提示:重写(Override)是在子类中重新定义自己的方法,但方法名称、参数个数与类型和父类完全相同。

(5)第17行至第24行,重新定义onCreate()方法,传入一个Bundle类型参数savedInstanceState。

(6)第20行,通过super.onCreate()方法调用MainActivity类的父类Activity的onCreate()方法,Bundle类型参数savedInstanceState用于保存当前Activity的信息。

(7)第22行,调用了setContentView()方法,给当前活动引入一个布局,即显示layout目录中activity_main.xml文件中定义的屏幕布局,界面和“Hello world!”应该在这个布局中,让我们打开这个文件看看。

2.Java文件注释

注释是对Java程序功能的解释或说明,其目的是提高程序的可读性,为阅读和理解程序提供方便,有利于程序开发人员进行交流和合作,从而提高开发效率,注释内容都会被编译器忽略。

对Java源代码进行注释,有以下3种类型:

(1)多行注释,以/∗开始,以∗/结束的一行或多行文字。

例如:

(2)单行注释,以双斜杠//开头,在该代码行的末尾结束。例如:

//创建一个Bundle对象,对象名为bundle

(3)文档注释,以/∗∗开始,以∗/结束的多行。

文档注释是Java特有的,主要用来生成类定义的API文档。

2.3.2 资源文件

在Android应用项目目录res中存放整个项目所用的全部资源文件,下面介绍其中的layout目录和values目录。

1.layout目录

存放应用程序的布局文件。

在应用项目FirstAndroidApplication的目录res/layout下,有activity_main.xml文件和fragment_main.xml文件。

(1)activity_main.xml文件代码如下:

(2)fragment_main.xml文件代码如下:

① 在上述两个文件的第1行标签中,都有属性xmlns:android=“http://schemas.android.com/apk/res/android”,这是XML命名空间的声明,用于告诉Android工具,涉及的公共属性已定义在命名空间,每一个Android布局文件的最外层标签必须有这个属性。

② 在fragment_main.xml文件中,有一个文本控件TextView,该控件由Android提供,用于在布局文件中显示文字,在TextView中,代码行android:text=“@string/hello_world”提示我们在string.xml文件中的hello_world中会有结果,运行结果快要找到了!

③ 第10行是对XML文件中的代码进行注释。

2.values目录

存放所有XML格式的资源描述文件,例如字符串(strings.xml)、颜色(colors.xml)、样式(styles.xml)、尺寸(dimens.xml)和数组(arrays.xml)等。

在应用项目FirstAndroidApplication的目录res/values下的strings.xml文件,其代码如下:

(1)第1行声明XML文件的版本号和编码方式,下一行是定义资源的标签。

(2)第3行至第5行定义了3个字符串常量,字符串的名称分别是app_name、hello_world和action_settings,相应内容分别是FirstAndroidApplication、Hello world!和Settings。

Hello world!值对应hello_world键,在布局文件activity_main.xml和fragment_main.xml中,通过引用hello_world键,找到相应值,到此,我们终于找到第一个Android应用项目运行结果的来源。

提示:Android应用开发建立在应用程序框架之上,用户界面V由XML担任,业务逻辑M由Java程序完成,以实现界面设计和程序逻辑的分离,具有低耦合性和高重用性、符合MVC设计思想。

3.XML文件注释

对XML文件中的代码进行注释,以<!--开始,以-->结束的一行或多行文字。

例如:

2.3.3 资源索引文件

gen目录下的R.java文件由Android自动生成,用户不要修改,该文件为项目中的各个资源在该类中创建其唯一的ID,当项目使用这些资源时,可以通过ID得到该资源的引用。

在项目FirstAndroidApplication的gen目录下的R.java文件的代码如下:

(1)第1行声明R.java文件所在的包为com.application.firstandroidapplication。

(2)在以下有关行中,分别为使用维度的资源dimen创建ID、为使用图片的资源drawable创建ID,为使用屏幕布局的资源layout创建ID,为使用字符串常量的资源string创建ID,为使用样式的资源style创建ID。

2.3.4 项目配置文件

Android项目配置文件AndroidManifest.xml存放在项目根目录下,该文件为项目的系统控制文件,在程序中定义组件需要在这里注册,是每个Android项目必需的文件。

在项目FirstAndroidApplication根目录下的AndroidManifest.xml文件的代码如下:

(1)第1行声明XML文件的版本号和编码方式,第2行声明XML的命名空间。

(2)第3行声明应用程序的包名为com.application.firstandroidapplication。

(3)第7行和第8行分别声明SDK最低版本为14,目标版本为19。

(4)第11行声明应用程序的图标使用drawable目录下的ic_launcher.png文件。

(5)第15行声明应用程序第一个运行的Java代码是src目录下包中的MainActivity.java文件。

(6)第16行声明屏幕上的标题显示的内容是string.xml中常量app_name定义的字符串。