android 入门之四【应用工程文件组成详解】
2010-05-22 00:26 蓝之风 阅读(2583) 评论(0) 编辑 收藏 举报前面通过android 入门之二【android 体系架构】和android入门之三【应用程序组成】从大的结构框架和应用级别了解了下android,这里将从应用工程的角度来了解一个典型的应用工程的文件组成是什么样的以及这些文件的作用和在android应用中扮演的角色,这里从一个最简单最典型的应用“HelloWorld”应用去逐个的分析android应用工程中各个文件夹或者文件的内容。
一、创建”HelloWorld“
前面已经讲过了android开发环境的搭建(android 入门之一【开发环境搭建】),这里使用第一节搭建的环境来创建第一个android应用程序。
打开Eclipse依次选择”File->New->Project...”弹出如下图对话框:
在对话框中选择Android下的”Android Project“,然后”Next“,弹出下面的对话框:
在Project name 中填写项目的名称“HelloWorld”,
在Contents中选择“Create new project in workspace”表示要新建一个项目,
第二项“Create project from existing source” 表示从已有的代码中创建项目,一般用于导入已经存在的项目到当前的工作窗口中。
再选择Use default loaction。
“Create project from existing sample” 表示创建android的示例项目,如果选自则会在项目中将android的示例导入到当前创建的项目中。
在Build Taget中选择android的版本,这里选择android 2.0。
在属性框中,填写应用的名称:“HelloWorld”,
Package name 为:“com.andorid.helloworld”
Activity 为:main
Min SDK Version:5,这个5表示当前Andorid SDK的版本。
以上参数填写完成后“Finish“,HelloWorld项目就创建完成了。
二、Android 标准工程文件的结构
将上面创建好的Helloworld项目中的文件夹逐一展开如下图所示
1.src目录
src 目录下放置的是Java源文件,这个文件中可以创建若干的Java包,在包中可以创建应用的处理逻辑,应用的Activity都会放在这个目录下,上图中的“main.java”就是在创建项目的时候创建的一个Activity,在Activity中可以编写控制View的逻辑。核心的控制逻辑都都会写在这里,看看“main.java”中都有什么:
1: package com.android.helloworld;
2:
3: import android.app.Activity;
4: import android.os.Bundle;
5:
6: public class main extends Activity {
7: /** Called when the activity is first created. */
8: @Override
9: public void onCreate(Bundle savedInstanceState) {
10: super.onCreate(savedInstanceState);
11: setContentView(R.layout.main);
12: }
13: }
代码解释:
第一行表示包的名称。
3,4行代码导入Android的包,相当于.net 中的using语句引入命名空间。
6到13行是main类的主体,main类继承自Activity,android中所有的用户界面展示的类都直接或间接继承自Activity。
8到12行是一个重要的函数,这个函数重写Actitity中的onCreate,每一个继承自Activity的子类都要重写该方法来初始化界面,和asp.net中Page_Load事件相似,可以在这个方法中初始化界面上的元素,8行中“Override”表示方法的“重写”是Java的关键字,11行设置了main这个Activity要展示的用户界面的配置文件,”R.layout.main”是一个资源的常量,这个资源是对main.xml的一个间接引用,当程序启动时将main.xml文件中的内容展示给用户。
2.Android 2.0目录
这个目录下放的是当前工程使用的android SDK.上图中表示当前项目引用的是Android SDK 2.0,不同版本的SDK这个文件的名会不同。
3.gen目录
gen目录下的Java包中有一个“R.java”文件,这个文件是由Eclipse自动生成的,开发者不用去修改和维护里面的内容,但是这个文件却非常有用,它和另一个文件夹res紧密相连,对res下资源的操作都会导致R.java文件的重新编译,R.java 中定义的常量类也是间接帮助Activity完成对资源的应用,android这样设计的好处是,使得复杂的资源通过专门的类来管理而使得程序中的代码变得整齐,强壮,不会出现一些“弱类型的字符串”而变成强类型(这里借用了.net中的术语),减少程序出错和减少bug。
基本的R.java的代码如下:
1: /* AUTO-GENERATED FILE. DO NOT MODIFY.
2: *
3: * This class was automatically generated by the
4: * aapt tool from the resource data it found. It
5: * should not be modified by hand.
6: */
7:
8: package com.android.helloworld;
9:
10: public final class R {
11: public static final class attr {
12: }
13: public static final class drawable {
14: public static final int icon=0x7f020000;
15: }
16: public static final class layout {
17: public static final int main=0x7f030000;
18: }
19: public static final class string {
20: public static final int app_name=0x7f040001;
21: public static final int hello=0x7f040000;
22: }
23: }
4.assets目录
这个目录中通常放置一些原生的资源,它会在android打包的时候原封不动的一起打包,安装时会直接解压到对应的assets目录中。这里同常放置一些项目中用到的多媒体资源等。注意:在醒目打包的时候删除掉项目中没有引用到的资源,因为这会占用设备资源同时也会“撑大”应用apk包
5.res目录
这个目录中放置的是android要用到的各种资源
drawale—*dpi 文件夹中放置一些图片资源项目ico等
layout 中放置项目布局的XML文件,所有UI布局的xml文件都放置这个文件夹中,并且每创建一个资源R.java中都会创建一个资源常量。android的UI是通过xml来描述的,它将UI展示和逻辑控制分离这也是android的一个有点,针对不同的分辨率的适配也是相当容易的,不用去改动业务逻辑只需要重新创建一套适应的xml布局就可以了。
main.xml文件内容:
1: <?xml version="1.0" encoding="utf-8"?>
2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3: android:orientation="vertical"
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent"
6: >
7: <TextView
8: android:layout_width="fill_parent"
9: android:layout_height="wrap_content"
10: android:text="@string/hello"
11: />
12: </LinearLayout>
这个文件中的内容就是android UI布局的描述,针对android的UI布局后面会专门用篇幅来介绍,这里不做过多的解释。
6.values目录
这个目录中放置的是一些字符串,数组,颜色,样式,动画等资源,好的程序设计习惯是将界面中所用到的信息资源以单独文件形式存储,这样好处是易于管理,易于维护,更重要的原因是在多语言处理的时候会非常方便,我想Google在当时设计android的时候一定充分考录到了这些因素,所以才使得多语言变得简单,values目录下的资源也是通过Eclipse来维护其和R.java的对应关系,Activity 不需要引用直接的资源而是通过引用R.java中的常量,这一点非常巧妙,也为我们编程带来了极大的便利,string.xml中的文件内容:
1: <?xml version="1.0" encoding="utf-8"?>
2: <resources>
3: <string name="hello">Hello World, main!</string>
4: <string name="app_name">HelloWorld</string>
5: </resources>
这个文件中定义了两个变量“hello” 和“app_name”,hello的值”Hello World,main !”表示在界面中显示这样一个问候语,它的引用在main.xml文件中:android:text="@string/hello",这个"@string/hello“是引用资源的常用的写法,以@+文件名+资源的名称。app_name的值“HelloWorld”表示项目的名称。在R.java的定义如下:
1: public static final class string {
2: public static final int app_name=0x7f040001;
3: public static final int hello=0x7f040000;
4: }
这里将文件名string.xml转化成一个string 静态类,文件中的资源名被转化成了一个静态的整型常量。
Values 目录中的每一个文件都会转化成R.java中的一个静态类,文件中的每一个资源都会转化成R.java中对应静态类的静态整型常量,这样Activiy中通过一个解析器就可以获取到对应的资源。
7.AndroidManifest.xml文件
这个文件是整个项目的配置资源,里面配置的内容包括,Activity,访问权限等等,这个文件相当于asp.net中的web.config文件。
AndroidManifest.xml文件的内容:
1: <?xml version="1.0" encoding="utf-8"?>
2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3: package="com.android.helloworld"
4: android:versionCode="1"
5: android:versionName="1.0">
6: <application android:icon="@drawable/icon" android:label="@string/app_name">
7: <activity android:name=".main"
8: android:label="@string/app_name">
9: <intent-filter>
10: <action android:name="android.intent.action.MAIN" />
11: <category android:name="android.intent.category.LAUNCHER" />
12: </intent-filter>
13: </activity>
14:
15: </application>
16: <uses-sdk android:minSdkVersion="5" />
17:
18: </manifest>
这个文件中7到13行配置了项目中的UI包、用到的Activity以及项目启动的主界面为“.main”(这main就是src目录下的那个main.java文件的类名)16行配置了使用android SDK的版本。
8.default.properties文件
这个文件中记录了android项目运行时的环境信息以及Android SDK的版本信息,文件的内容如下:
1: # This file is automatically generated by Android Tools.
2: # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3: #
4: # This file must be checked in Version Control Systems.
5: #
6: # To customize properties used by the Ant build system use,
7: # "build.properties", and override values to adapt the script to your
8: # project structure.
9:
10: # Indicates whether an apk should be generated for each density.
11: split.density=false
12: # Project target.
13: target=android-5
小结:
咋一看好像android中的资源引用关系很复杂,其实只要理顺它们之间的关系就不难理解了,并且这个架构非常的灵活,尤其在对语言和多分辨率的支持为开发者做了很多工作,不用在去为了适配不同语言和不同分辨路的机型而搞的焦头烂额。
作者:蓝之风
出处:http://www.cnblogs.com/vaiyanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。