-

第四章 应用程序结构

本教程将主要以探索与了解为主要目的,但后续的系列文章则将进一步带大家深入学习如何创建用户界面、响应用户交互操作以及利用Java编排应用逻辑。我们将专注于大家刚刚开始接触Android开发时最常遇到的项目内容,但也会同时涉及一部分已经存在于应用结构当中的其它一些元素。在今天的文章中,我们不会对这些额外元素进行深入探讨。总而言之,了解关于Android应用的基础创建知识,这就是我们今天要完成的任务。

1. 源文件

第一步

打开Eclipse并在Package Explorer当中查找我们已经创建完成的项目。在“src”文件夹里,大家应该会看到设置项目所命名的项目包。包中应该包含我们的Activity类文件,这也是要在编辑器中打开的内容。源文件夹保存着我们在开发Android应用时所要用到的全部Java文件。

4.1android_project_folders

每当我们创建一个项目时,都会创建一个用于容纳各Java类文件的包。一款应用程序可能拥有不止一个包,而且每个包当中也可能容纳着多个类文件。这些类文件中的处理代码能够将我们的应用呈现给用户、响应用户的交互操作并执行任何的必要处理。从实质上看,类文件是在根据面向对象概念模型划分与应用程序相关的代码。

我们将在后续文章中进一步讨论关于Java的概念以及对应实践。在今天的教程内,大家只需理解一个Java应用会将各类处理任务拆分成一定数量的对象。每个对象都由一个类声明来定义,这在应用程序中通常是一个独立的文件,不过也可以被嵌套在其它类文件当中。一个对象基本上就是一大段代码,其中承载着与应用程序相关的某项功能的一部分。类文件中的代码能够引用应用程序中的其它类或者应用程序中的其它包。

在大家着手进行应用程序开发时,首先需要向源文件夹中的包中添加Java类。一个向用户提供用户界面的典型Android应用将拥有至少一个Activity文件,应用中的不同屏幕显示内容还要用到更多Activity类。其它一些类型的应用,例如工具程序或者服务,则采用不同的结构。大家最好首先关注Activity UI这种类型的应用程序,并在熟练掌握之后再接触其它应用类型。

第二步

现在查看新应用中的Activity类文件。我们会在本系列教程的后续文章中进一步探讨Activity代码,因此目前大家不用太过关注细节。今天我们主要面向应用中的主Activity,它会在应用启动后同时开始生效。大家的应用也可能会启动其它一些用于用户交互的Activity。在我们创建自己的项目时,Eclipse会对应用进行设置并将主Activity作为主类——它在项目清单当中也将被作为主Activity进行显示,我们稍后会看到。

在主Activity类当中,大家会看到onCreate方法,其中包含的代码将在Activity被创建——也就是应用程序启动时开始执行。在该方法中,大家会看到以下代码行:

setContentView(R.layout.activity_main);

在我们启动项目之后,这一行的内容用于指定我们所创建的布局文件,告诉Android将其作为内容视图。这意味着无论布局文件中包含什么样的内容,都将在该Activity显示在屏幕上时呈现给用户。

我们将在稍后进一步探讨相关话题,目前暂时需要将注意力集中在“R.layout.activity_main”语法上。这就是我们的Java代码引用应用程序资源的方式。我们将利用类似的语法通过资源的ID值对其进行引用,例如图片及数据值等资源也可以通过这种方式实现引用。其中的“R”代表应用资源,后面的部分则用于指定保存在“res/layout”目录下的条目类型——在这里就是布局。这些资源最终要根据其名称进行识别——对于示例中的布局,使用的就是文件名。由此推断,我们要使用的语法就成了“R.type.name”。在我们开始编程之后,各位就会开始使用该语法。

在本系列的后续文章中,我们将向Activity类文件中添加代码以实现用户交互。现在打开应用中的“res”文件夹,大家会在其中找到多个子文件夹。这些文件夹是由Eclipse与ADT在我们启用新Android项目后默认创建而成的,不过我们可能还需要为不同类型的资源添加其它一些目录。

2. 布局资源

正如我们已经看到,项目创建后所生成的布局文件会保存在“res/layout”文件夹中。如果某款应用拥有多个Activity屏幕,那么一般会为每个屏幕保留一个独立的布局文件。大家可能还会将布局文件用于个别UI组件。当大家为Activity创建类文件时,需要如上所述利用setContentView进行布局设置。除此之外,大家也可以通过Java代码进行布局设置——这算是种备选方案。在我们的示例中,布局设置是在应用执行时动态生成的。不过利用XML的优势在于,我们可以在界面设计工作中直观感受布局方案的视觉效果。

在应用程序的主布局文件当中(现在应该已经用编辑器打开了),大家会看到XML结构。如果各位之前没有接触过XML也不必担心,我们会在后续文章中进一步讨论这些基础知识。就目前来说,大家只需了解:XML是一种标记语言,类似于HTML——如果之前接触过Web开发的话。XML文件利用树状结构作为数据模型。通常来说,一个布局文件拥有一个根布局元素,并将其作为特定布局类型模型——其中所包含的用于UI条目的子元素则包括按钮、图片及文本等。

3. 可绘制资源

大家在资源目录下应该会看到多个在名称中包含“drawable”字样的文件夹,这些文件夹用于保存应用程序所使用的图片文件。这些图片文件可以是我们在Eclipse之外所准备的数字图片文件,格式包括PNG或者JPEG等。或者,大家也可以通过XML代码来描述形状、颜色以及外观,从而定义特定可绘制资源。一旦我们在drawable文件夹中创建了文件,就可以在应用布局文件或者Java代码中进行引用。这样一来,之前准备好的视觉元素就能用于应用UI了。

资源目录中会保留针对每一种尺寸的drawable文件夹。这些尺寸是各类运行Android系统的设备在像素密度方面的通用型分类依据。具体类别分为低、中、高、超高与超超高密度四种。只需从对应类型中作出选择,我们就可以在对应尺寸的帮助下轻松简化多屏幕密度的支持过程。这意味着当我们在项目中包含图片文件时,可以将其放置在不同的文件夹当中,并通过裁剪提供满足各种密度方案的版本。

4. 数据资源

在“res”目录中,我们会看到一些标题中带有“values”字样的文件夹。这些文件夹用于容纳大家希望在应用程序中所使用的数据值。这些值可以包含文本字符串以及数字。包含XML文件的值文件夹会列出其中的一项或者多项值。每份列表都包含一个名称以及内容中的值。应用中的其它文件,例如Java类或者布局文件,能够通过这些名称为引用这些值。在典型用例中,我们能够需要通过这些保存在文本字符串的值在UI元素当中显示内容——例如按钮。

应用程序中的不同值文件,允许大家针对特定屏幕尺寸及API级别对值进行修改。如果同样的值足以应对多种设备,则可以被直接保存在“Values”文件夹内。

5. Manifest文件

在查看应用程序中的主文件夹时,大家一定会发现项目的Manifest文件。通过双击即可利用编辑器将其打开。接下来,我们会看到一个显示其内容的视图。点击编辑器窗口底部的“AndroidManifest.xml”标签来查看其XML代码。这个文件将应用程序的各个方面定义成统一整体。Eclipse与ADT会在我们创建应用的同时,在清单中创建特定元素,具体创建方式取决于大家在项目创建过程中的设置。大家可以手动向清单中添加其它元素,例如添加其它Activity。

4.2android_manifest_tab

我们将运行其中的一部分主元素,旨在理解Manifest文件的作用,不过还有其它多种元素可以被包含其中。在Manifest文件中所列举的新应用项目元素当中,我们将看到uses-sdk元素,我们利用它表示最小及目标API级别。Application元素中包含指向启动机制与应用程序名称的属性。在application元素中还存在着一个activity元素,会在应用程序开始运行时通过intent-filter元素作为主Activity启动。当我们向应用中添加新的Activity时,则会为每个相关元素添加新的activity元素。

大家可能还需要向Manifest中添加其它元素,其中包括uses-permission元素,用于罗列应用所要求的权限——用户会在安装应用之前观看到该列表。权限中包含多种操作条目,例如通过互联网获取数据、写入存储或者访问设备上的其它功能——如相机。清单还会列举应用程序所能支持的设备类型以及其它一些应用程序组件(例如后台服务)。

6. 其它文件

讲到这里,我们已经谈到了大家需要了解的Android应用程序项目结构中的各大主要方面。随着对Android开发的学习,大家将在今后经常与这些内容打交道。通过Eclipse,我们还会看到项目中包含的其它一些文件及目录,不过就目前来说基本都可以直接忽略。

正如在前面看到的,大家可以利用“R.”语法实现资源引用。Eclipse以及管理系统的ADT都会引用应用中来自Java的资源。当大家在项目中对这些资源进行添加或者编辑时,Eclipse会将对应内容写入“R.java”文件,从而帮助我们利用“R.”进行资源引用。当大家开始处理自己的Java文件,会在引用时看到Eclipse弹出的提示信息——这种机制能简化对应用资源的管理工作。“R.java”文件被保存在“gen”文件夹中。请注意:千万不要尝试直接编辑这个文件,它会在我们编辑项目资源时自动生成。系统会通过为应用中的每项资源分配惟一整数ID的形式管理这一过程。

提示:当大家开始尝试Android应用程序开发时,可能会在使用R时遇到问题。如果Eclipse显示任何与R相关的错误信息,特别是“R无法被解析为一个变量”,则需要检查类文件的起始内容,看看其中是否存在“R”的导入语句,例如“import android.R;”。如果找到了对应内容,特别是在已经将代码复制并粘贴到文件中后,请删除这一导入语句。如果遇到其它与R相关的提示,请确保资源文件当中不存在错误。如果问题仍然存在,尝试利用“Project”, “Clean”清理项目。当一切努力皆告失败时,试着重新启动Eclipse。

总结

在本篇文章中,我们了解了关于Android项目结构的基础知识。大家可以再花点时间随意查看项目中的其它文件及文件夹,借此了解项目的整体结构。在接下来的后续教程中,我们将在应用中创建用户界面元素并处理用户交互操作。我们还会探讨关于Java编程的基本特性,借此进一步提升自己对Android开发项目的理解。