二、 创建 Android Eclipse 工程
请参考的《Android SDK 2.3与Eclipse最新版开发环境搭建(五)》,
三、 工程结构详细解析
1. 工程结构
在Eclipse的Java透视图中,可以看到工程的Package Explorer如下图:
具体包括:
src 文件夹 - 包含示例应用程序的包,即org.deaboway.test。
R.java - Android Developer Tools 自动创建这个文件,它提供访问 Android 应用程序的各种资源所需的常量。后面会详细讨论 R 类与资源之间的关系。
HelloAndroidWorld.java - 应用程序的主活动类的实现。
Referenced libraries - 包含 android.jar,这是 Android SDK 中的 Android 运行时类的 jar 文件。
res 文件夹 - 包含应用程序的资源,包括:
· drawable - 图标:这个文件夹包含图形文件,比如图标和位图。
· layout - 布局文件:这个文件夹包含表示应用程序布局和视图的 XML 文件。
· values - 字符串:这个文件夹包含 strings.xml 文件。这是为应用程序实现字符串本地化的主要方法。
AndriodManifest.xml - 示例应用程序的部署描述符。
default.properties 和proguard.cfg – 从2.3版本以后,android sdk 本身包含proguard,可以通过正常的编译方式也能实现代码混淆,我们可以看到android-sdk-windows\tools\下面多了一个proguard文件夹。防止反编译工具进行反编译,保证代码安全。
2. 主类分析
这个示例应用程序由一个Activity(活动)组成,即HelloAndroidWorld。正如前面提到的,HelloAndroidWorld类是在HelloAndroidWorld.java 文件中实现的。
package org.deaboway.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView ;
public class HelloAndroidWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
// TextView textView = new TextView(this);
// textView.setText("Hello Android World!");
// setContentView(textView);
setContentView(R.layout.main );
}
}
在这个源代码片段中,要注意几点:
HelloAndroidWorld 是一个普通的 Java 类,包含包和导入语句。 HelloAndroidWorld 扩展 android.app 包中的 Android 基类 Activity。 onCreate() 方法是这个活动的入口点,它接受一个 Bundle 类型的参数。Bundle 类本质上是 map 或 hashmap 的包装器。在这个参数中传递构造活动所需的元素。这里暂时不讨论这个参数。 setContentView() 负责用 R.layout.main 参数创建主 UI。R.layout.main 是应用程序资源中主布局的标识符。3. R.java文件
R.java 文件是在构建时自动创建的,所以不要手工修改它,因为所有修改都会丢失。本实例的R.java文件内容如下:
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package org.deaboway.test;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon =0x7f020000;
}
public static final class layout {
public static final int main =0x7f030000;
}
public static final class string {
public static final int app_name =0x7f040001;
public static final int hello =0x7f040000;
}
}
R 类包含一些匿名子类,每个子类包含前面描述的各种资源的标识符。注意,这些类都是静态的。
请注意 R.layout.main 代表的元素。这个标识符代表由 main.xml 定义的布局。在活动的 onCreate 方法中可以使用这个值:setContentView(R.layout.main)。这就是在运行时把特定的活动(这里是HelloAndroidWorld)和特定的布局(主布局)联系在一起的方法。
4. main.xml文件
本示例应用程序包含一个活动和一个视图。应用程序包含一个名为 main.xml 的文件,它代表活动的主 UI 的视觉方面。
注意,在 main.xml 中没有指定在哪里使用这个布局。这意味着,如果需要的话,可以在多个活动中使用它。
"1.0" encoding="utf-8" ?>
"http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
这是最简单的布局,其中只有一个垂直的线性布局,这意味着所有元素排成一列。这里有一个 TextView 元素,它与其他开发环境中的标签类似。TextView 代表不可编辑的静态文本。
注意,每个视图元素(比如这个示例中的 LinearLayout 和 TextView)都有属于 Android 名称空间的属性。一些属性是所有视图元素都有的,比如 android:layout_width 和android:layout_height。这些属性可以采用的值是:
fill_parent - 使视图元素占满可用的空间。也可以认为这就是 “拉伸”。
wrap_content - 这个值让 Android 把元素一个接一个地排列,不进行拉伸。
5. AndroidManifest.xml文件
AndroidManifest.xml 文件是 Android 应用程序的部署描述符。这个文件列出应用程序中包含的所有Activity(活动)、ContentProvider(内容提供程序)、BroadcastReceiver(广播接收器)与Service(服务),以及应用程序支持的 IntentFilter。下面是这个示例应用程序的完整的 AndroidManifest.xml 文件。
"1.0" encoding="utf-8" ?>
"http://schemas.android.com/apk/res/android"
package="org.deaboway.test"
android:versionCode="1"
android:versionName="1.0" >
"@drawable/icon" android:label="@string/app_name" >
".HelloAndroidWorld"
android:label="@string/app_name" >
"android.intent.action.MAIN" />
"android.intent.category.LAUNCHER" />
这里指定了源文件中的包名。采用与 Java 源文件和导入语句相似的模式。 标记的实际作用是 “导入” 这个包中的类。在这个文件中,所有非完全限定的类都属于 package 属性指定的包。 标记的一个属性引用了应用程序的一个资源。请注意 drawable 标识符前面的 @ 符号。这里的意思是,在应用程序资源的 drawable 文件夹中寻找名为 “icon” 的资源。 标记包含以下属性和值: android:name表示实现这个活动的 Java 类。 android:label 是应用程序的名称。注意,它来自一个字符串资源。string.xml 文件包含应用程序的本地化字符串。 表示应用程序中可用的 IntentFilter。这是 Android 应用程序中最常见的 IntentFilter。这个过滤器的实际意思是,它实现 “主” 操作(也就是入口点),而且它位于 OS 的启动器中。这意味着可以在 Android 设备上像启动其他应用程序一样,从应用程序主列表中启动它。