插播一些Android基本概念

要求在本文中植入一段广告,现在开始插播。广告同样精彩,请勿走开。

图 9 “Hello World”的工程目录结构

从Eclipse中展开“AgsSampleHelloWorld”工程,我们就可以看到图 9这样的目录结构。在这个目录结构中,最扎眼的就是“src”目录和其中的“HelloWorld.java”,这让我们马上意识到这是一个Java程序。没错,Android系统虽然是基于Linux内核的,但是在Android开发应用程序却是使用Java语言,Java代码编译出来的字节码将运行在Linux系统中的一个虚拟机中,这个虚拟机名为Dalvik[1]。

在工程的根目录下有两个配置文件,“default.properties”和“AndroidManifest.xml”。这两个配置文件在这么“根”的位置,当然是对整个工程有提纲挈领的作用,先看这个“default.properties”,打开只有一行实际内容(和很多行注释):

target=android-8

从这个文件的注释中知道,你既无需修改这个文件,也从中得不到很多信息,这个文件只是告诉了Android的编译系统,这个工程的目标平台是“android-8”,也就是Android 2.2。

图 10 Android平台版本和API版本的关系

但是,“AndroidManifest.xml”就不一样了,从名字就可以知道,这是Android工程的清单文件,直接用文本编辑器打开它可能是如下的内容:

<?xml version=<i>"1.0" encoding="utf-8"?>
<manifest xmlns:android="<i">"http://schemas.android.com/apk/res/android"</manifest>
package="com.esri.arcgis.android.samples"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="<i">"@drawable/icon" android:label=<i>"@string/app_name"</i>></application>
<activity android:name="<i">".HelloWorld"</activity>
android:label="@string/app_name">
<intent-filter></intent-filter>
<action android:name="<i">"android.intent.action.MAIN" /></action>
<category android:name="<i">"android.intent.category.LAUNCHER" /></category>
<uses-permission android:name="<i">"android.permission.INTERNET"></uses-permission>
<uses-permission></uses-permission>android:name="android.permission.WRITE_EXTERNAL_STORAGE">
<uses-permission></uses-permission>android:name="android.permission.ACCESS_FINE_LOCATION">
<uses-sdk android:minsdkversion="<i">"7" /></uses-sdk>
在这个清单文件的下方,有一些<user-permission>元素,它包含了这个工程正常运行所需要的权限,比如“AgsSampleHelloWorld”运行时会显示一个在线的地图,那么显然,它运行时需要一个Internet连接,所以,这里需要配置“android.permission.INTERNET”这个用户权限。这样,在这个应用程序被安装的时候,Android就会询问用户:“你是不是允许这个程序访问Internet?”,如果用户允许了,你的应用程序才能正常地获取地图。当然,不要担心编写配置文件是一件很麻烦的事情,Android开发工具提供了“Android Manifest Editor”帮助你可以比较方便地编辑清单文件,比如用户权限就可以如图 11这样地修改。</user-permission>

图 11 使用Android开发插件配置工程权限
再往上看,清单文件中的<application>元素中包含的是对应用程序包含组件的描述。首先,让我们把<application>元素本身的属性值挑出来看看:</application></application>
<application android:icon="<i">"@drawable/icon" android:label=<i>"@string/app_name"</i>></application>
“@drawable/icon”显然是这个程序的图标,但是具体对应到哪个图片呢?这还得继续看当前工程的目录结构,在工程目录下有个“res”文件夹,其中主要存放应用程序的各种资源,而以“drawable-”打头的几个目录就是存放图片的目录,不同目录后面会跟着“hdpi”[2]、“mdpi”[3]、“ldpi”[4]之类不同的内容,这些目录下对应的是不同尺寸屏幕下的不同图片,因为小屏幕可能只需要小图片,大屏幕可能就需要更大更精细的图片。

图 12 res目录下的资源
“@string/app_name”则对应了一段字符串,这个字符串是在“res/values”目录下的“strings.xml”文件中定义的,打开这个文件是如下的内容:
<?xml version=<i>"1.0" encoding="utf-8"?>
<resources></resources>
<string name="<i">"hello">Hello World, HelloWorld!</string>
<string name="<i">"app_name">HelloWorld Sample</string>
想必,等会应用程序运行起来后,它的标题栏上应该会显示“HelloWorld Sample”这一行内容,对吧。
为什么我们在一些目录和XML文件中配置一些内容,Android程序就能知道从哪里去获取真实的资源呢?因为Android开发工具会帮助我们生成一个“R.java”源文件,这个源文件定义了一个名为“R”的类,这个类中不同的静态变量指示了各种资源的不同位置,在后面你可以看到,在程序的Java代码中,我们可以直接通过R.xxx.xxx指代一个资源。

图 13 自动生成的R.java

清单文件的<application>元素内还有<activity>元素,这对应了Android程序中的Activity。由于本次广告插播时间过长,这些内容留待后续再说,不过,现在起码你对一个Android工程中大概包含的内容应该有所了解了吧?</activity></application>