当前位置: 代码迷 >> Android >> Android项目构造
  详细解决方案

Android项目构造

热度:108   发布时间:2016-04-28 07:01:59.0
Android项目结构

Android各个文件夹作用?

程序工程架构

Hello?World项目的创建,我们可以将一个?Android?应用程序基本的档桉结构归纳成如下:

?

我们来看看?Android?应用程序的基本档桉结构,以及各自所负责的内容。

1.src文件夹(存放源代码)

src?目录中包含了一个?Android?应用程序中所需的各个程序码档桉。这些档桉被包在?对应?package?的?子?目?录?下?,存放android项目的源代码

2.gen文件夹(自动生成目录

gen文件夹下最终要的是R.java,R.java?这个档是自动产生的。会由?ADT?插件自动根据你放入?res?目录的?XML?描述文件、图像等资源,同步更新修改?R.java这个文件中,R.java是定义该项目所拥有资源的索引文件

以?R.java?为名的这个档,你完全不需要,也应避免和禁止手工修改?R.java?这个档

R.java?中自动产生的R?类别就像是个字典一样,包含了使用者界面、图像、字串等各式的资源与相应的编号?(id)?。?Android?应用程序中很多时候会需要透过?R?类别调用资源。?编译时编译器也会查看这个资源列表,没有使用到的资源就不会编译进去,为手机应用程序节省不必要没用的空间。

?

3.res文件(资源?(Resource)?目录

????a.?drawable?存放着相应的图片,分为低中高三种分辨率,分别存放在相应的目录里?
????b.?layout?布局所需要的文件(main.xml),界面的布局了,按钮等各种控件的摆放方式等等?
????c.?values?主要存放Project所需要的字符串资料string.java,开发中需要用到的标识。

d.??androidManifest.xml文件(Android?功能清单

?AndroidManifest.xml?是?Android?程序的功能清单,应用程序在这离列出该工程所提供的功能。当应用程序开启时,会提供诸如内容提供者?(ContentProvider)?、处理的资料类型、?实际运行的类别、跨应用程序的资讯等等讯息。?你可以在此指定你的应用程序会使?用到的服务?(?诸如电话功能、网路功能、?GPS?功能等?)?。当你新增一个页面行为类别?(Activity)?时?你也需要先在此注册这个新增的?Activity?类别后,才能顺利调用。

?

?

?

?

?

?

?

?

?

?

?

?

下面是HelloAndroid项目在eclipse中的目录层次结构:

由上图可以看出项目的根目录下共有九个文件(夹),下面就这九个文件(夹)进行详解:

1.1src文件夹和assets文件夹:

每个Android程序都包含资源目录(src)和资产目录(assets),资源和资产听起来感觉没有多大差别,但在存储外部内容时用资源(src)比较多,其中它们的区别在于存放在资源(src)下的内容可以通过应用程序的R类进行访问,而存放在资产(assets)下的内容会保持原始文件的格式,如果需要访问,则必须使用AssetManager以字节流的方式来读取,用起来非常的不方便。为了方便使用,通常文件和数据都会保存在资源(src)目录下

1.2res(Resource)目录:资源目录

可以存放一些图标,界面文件和应用中用到的文字信息,下图为res目录截图:

1.2.1 drawable-*dpi文件夹:将图标按分辨率的高低放入不同的目录,其中draeable-hdpi用来存放高分辨率的图标,drawable-mdpi用来存放中等分辨率的图标,drawable-ldpi用来存放低分辨率的图标

1.2.2 values文件夹:用来存放文字的信息

(1)strings.xml:用来定义字符串和数值

<?xml version="1.0"encoding="utf-8"?>

<resources>

?

??? <string name="hello">Hello World, Hello 3G</string>

??? <string name="app_name">Android1.1</string>

??????? <string name="test">哥想你了</string>

?? ?????<string name="startButton">按钮1</string>

??????? <string name="start">按钮1</string>?

</resources>

每个string标签生命了一个字符串,name属性指定它的引用值

(2)为什么要把这些出现的文字单独放在strings.xml文件中?

答案:一是为了国际化,如果需要将文件中的文字换成别的国家的语言,就可以只需要替换掉一个strings.xml文件就可以了

二是为了减少应用的体积,例如,我们要在应用中使用“哥想你了”这句话1000次,如果我们没有将“哥想你了”定义在strings.xml文件中,而是直接在应用中使用时写上这几个字,那么我们就会在应用中写4000个字。4000个字和4个字占用的内存可是有很大差距的啊,况且手机的内存本来就小,所以应该是能省就省

(3)另外还有arrays.xml,color.xml等定义数组,颜色的,都最好用单独的一个xml文档

1.2.3 layout文件:用来存放界面信息

本例中的布局文件是自动生成的“main.xml”

<?xml version="1.0"encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

??? android:layout_width="fill_parent"

??? android:layout_height="fill_parent"

??? android:orientation="vertical">

?

??? <TextView

??????? android:layout_width="fill_parent"

??????? android:layout_height="wrap_content"

??????? android:text="@string/test"/>

???

</LinearLayout>

<LinearLayout>元素:线性布局的意思,在该元素下的所有子元素都会根据他的”orientation”属性来决定是按行还是按列或者按逐个显示进行布局的

<TextView>元素:是一种显示控件,他的”text”属性指定了在这个元素上显示的内容

1.3 gen目录:gen目录下只有一个自动生成的“R.java”文件

/*AUTO-GENERATED FILE.? DO NOT MODIFY.

?*

?* This class was automatically generated bythe

?*?aapt?tool from the resource data itfound.? It

?* should not be modified by hand.

?*/

?

packagecn.csdn.android.demo;

?

public final class?R {

????public static final class?attr {

??? }

????public static final class?drawable {

????????public static final int?ic_launcher=0x7f020000;

??? }

????public static final class?id {

????????public static final int?button1=0x7f050000;

????????public static final int?radioButton1=0x7f050001;

????????public static final int?toggleButton1=0x7f050002;

??? }

????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;

????????public static final int?start=0x7f040004;

????????public static final int?startButton=0x7f040003;

????????public static final int?test=0x7f040002;

??? }

}

?

R.java文件:默认有attr,drawable,layout,string这四个静态内部类,每个静态内部类对应一中资源,如layout静态内部类对应layout中的界面文件,string静态内部类对应string内部的string标签。如果在layout中在增加一个界面文件或者在string内增加一个string标签,R.java会自动在其对应的内部类增加所增加的内容。

R.java除了自动标识资源的索引功能外,还有另一个功能,就是当res文件中的某个资源在应用中没有被用到,在这个应用被编译时,系统不会把对应的资源编译到应用中的APR包中。

1.4 AndroidManifest.xml 功能清单文件

每个应用程序都会有一个AndroidManifest在它的根目录里面。这个清单为Android系统提供了这个应用的基本信息,系统在运行之前必须知道这些信息,另外,如果我们使用系统自带的服务,如拨号服务,应用安装服务等,都必须在AndroidManifest.xml文件中声明权限

AndroidManifest.xml的功能:

命名应用程序的Java应用包,这个包名用来唯一标识应用程序;

描述应用程序的组件,对实现每个组件和公布其功能的类进行命名,这些声明使得Android系统了解这些组件以及它们在什么条件下可以被启动

决定哪个组件运行在哪个进程里面

声明应用程序必须具备的权限,用以访问受保护的API,以及和其他进程的交互

声明应用程序其他的必备权限,用以组件之间的交互

列举application所需要链接的库

以HelloAndroid项目的功能清单为例子进行讲解:

<?xml version="1.0"encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

??? package="cn.csdn.android.demo"

??? android:versionCode="1"

??? android:versionName="1.0">

?

??? <uses-sdk android:minSdkVersion="8"/>

?

??? <application

??????? android:icon="@drawable/ic_launcher"

??????? android:label="@string/app_name">

??????? <activity

??????????? android:label="@string/app_name"

??????????? android:name=".HelloActivity">

??????????? <intent-filter >

??????????????? <action android:name="android.intent.action.MAIN"?/>

?

??????????????? <category android:name="android.intent.category.LAUNCHER"?/>

??????????? </intent-filter>

??????? </activity>

??? </application>

</manifest>

1.4.1 <manifest>元素

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

??? package="cn.csdn.android.demo"

??? android:versionCode="1"

??? android:versionName="1.0">

<manifest>元素是AndroidManifest.xml的根元素,”xmlns:android”是指该文件的命名空间,“package”属性是Android应用所在的包,“android:versionCode”指定应用的版本号,如果应用不断升级,则需要修改这个值,”android:versionName”是版本的名称,这个可以根据自己的喜爱改变

1.4.2 <application> 元素

<application

??????? android:icon="@drawable/ic_launcher"

??????? android:label="@string/app_name">

??????? <activity

??????????? android:label="@string/app_name"

??????????? android:name=".HelloActivity">

??????????? <intent-filter >

????????????? ??<action android:name="android.intent.action.MAIN"/>

?

??????????????? <category android:name="android.intent.category.LAUNCHER"?/>

??????????? </intent-filter>

??????? </activity>

??? </application>

<application>元素是一个很重要的元素,开发组件都会在此下定义

<application>元素的”icon”属性是用来设定应用的图标,[email protected]/ic_launcher”的意思是:在R.java文件中的drawable静态内部类下的icon,如下图所示

<application>元素的“label”属性用来设定应用的名称,[email protected]/app_name”和上述的一样,也是R.java文件中的string静态内部类下的app_name

1.4.3 <activity>元素

<activity

??????????? android:label="@string/app_name"

???????????android:name=".HelloActivity"?>

??????????? <intent-filter >

??????????????? <action android:name="android.intent.action.MAIN"?/>

?

??????????????? <category android:name="android.intent.category.LAUNCHER"?/>

??????????? </intent-filter>

??????? </activity>

<activity>元素的作用是注册一个activity信息,当我们在创建“HelloAndroid”这个项目时,指定了“Created Activity”属性为“HelloActivity”,然后ADT在生成项目时帮我们自动创建了一个Activity,就是“HelloActivity.java”;

<activity>元素的“name“属性指定的是Activity的类名,其中“.HelloActivity”中的“.”指的是<manifest>元素中的“package”属性中指定的当前包,所以“.HelloActivity”就相当于“cn.csdn.android.demo.HelloActivity.java”,如果Activity在应用的包中可以不写“.”,但是为了避免出错,还是写上这个点把

1.4.4<intent-filter>元素

<intent-filter >

??????????????? <action android:name="android.intent.action.MAIN"?/>

?

??????????????? <category android:name="android.intent.category.LAUNCHER"?/>

</intent-filter>

<intent-filter>如果直接翻译的话是“意图过滤器”,组件通过<intent-filter>告诉它们所具备的功能,就是能响应意图类型,在intent中设置action, data, categroy之后在对应的intentfilter中设置相同的属性即可通过过滤被activity调用

1.5<project.properties>应用要求运行的最低Android版本

1.6<android 2.2>? 存放Android自身的jar包

?

?

?

?

?

?

?

?

?

?

1、HelloWorld项目的目录结构

  • 1.1、src文件夹
  • 1.2、gen文件夹
  • 1.3、Android 2.2文件夹
  • 1.4、assets?
  • 1.5、res文件夹
  • 1.6、AndroidManifest.xml
  • 1.7、default.properties

如图所示

?

?

?

src文件夹,顾名思义,就是存放java源代码的地方。

例如我们的代码如下

?

[java]?view plaincopy
?
  1. package?cn.com.android.phone;??
  2. ??
  3. import?android.app.Activity;??
  4. import?android.content.Intent;??
  5. import?android.net.Uri;??
  6. import?android.os.Bundle;??
  7. import?android.view.View;??
  8. import?android.view.View.OnClickListener;??
  9. import?android.widget.Button;??
  10. import?android.widget.EditText;??
  11. ??
  12. public?class?PhoneCaller?extends?Activity?{??
  13. ????private?EditText?editText;??
  14. ????@Override??
  15. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  16. ????????super.onCreate(savedInstanceState);??
  17. ????????setContentView(R.layout.main);??
  18. ??????????
  19. ?????????editText?=?(EditText)?findViewById(R.id.editText);??
  20. ??????????
  21. ????????Button?button?=?(Button)?findViewById(R.id.myButton);??
  22. ????????button.setOnClickListener(new?OnClickListener(){??
  23. ??
  24. ????????????public?void?onClick(View?v)?{??
  25. ????????????????String?number?=?editText.getText().toString();??
  26. ????????????????//?声明打电话的意图??
  27. ????????????????Intent?intent?=?new?Intent(Intent.ACTION_CALL,Uri.parse("tel:"+number));??
  28. ????????????????//?将意图传递给操作系统??
  29. ????????????????PhoneCaller.this.startActivity(intent);??
  30. ????????????}??
  31. ??????????????
  32. ??????????????
  33. ????????});??
  34. ??????????
  35. ??????????
  36. ??????????
  37. ??????????
  38. ??????????
  39. ????}??
  40. }??

?

我们的类继承了Activity这个类。一般我们都会实现其中的onCreate方法和onPause方法

?

onCreate方法

?????? 该方法主要用于初始化我们的Activity。当用户通过请求和我们交互的时候,我们就通过Activity做出相应的处理。Activity从功能上说,比较像struts中的action.是系统和用户交互的一个接口。

onPause方法

?????? 该方法在当你的Activity被销毁前执行的方法,一般用来进行数据的实例化。(Activity被销毁的原因有很多种,比如人为的,或者系统内存不足时等等)。

?

gen文件夹

?????? gen文件夹,主要包含一个R.java文件,这个文件是由系统自动维护的,不允许人为的修改,否则将会出现很多让你郁闷的错误。

?????? R.java是一个android资源的索引文件,里面定义了大量的静态内部类和静态常量,静态类的名称都和res文件夹下的文件夹一一对应的。如图

?

?

?

?

?

?

既然都是索引文件,那么该文件的作用和数据库中索引作用肯定也是差不多。它可以帮助我们快速的定位文件,此外,编译器还会检查R.java中定义的资源是否被使用了,如果没有被使用,那么打成安装包的时候,会自动过滤掉那些没被使用的资源,这样可以大大的节约空间。

(在强调一遍,没事不要瞎改R.java文件)?

?

Android 2.2文件夹

?

??? 没什么可说的,一个基础jar包。

?

asset文件夹

?

??? 该文件夹下通常会存放一些资源文件,例如mp3/视频文件等等。

???? 这个文件被称为原生文件夹,意思就是存放在这里的文件在打包成安装包时,会原样打包,不进行压缩等各种处理。这和res文件夹下的文件是不一样的,res下的资源文件会进行压缩处理的。主要的目的,实际上还是为了节约空间。

?

res文件夹

?

???? 主要有三个子文件夹,drawable_?dpi、layout、values

?????? drawable_?dpi:很多人疑问为什么这个文件夹下会分出来三个子文件夹,drawable_hdpi高分辨率、drawable_ldpi低分辨率、drawable_mdpi一般分辨率,实际上这和我们在asset中提到的文件优化压缩有关,android会对三个文件夹下的文件使用不同的压缩优化算法。这样就既保证了我们对某些图片较高分辨率的要求,也保证了这些资源不会占用太多的空间。

????? layout存放布局文件。包括主布局文件和一般的组件布局文件。

????? values下可以存放很多.xml文件,例如arrays.xml、colors.xml、dimens.xml、styles.xml,当然这些xml文件的名称都是随意取得。

?

AndroidManifest.xml

?

????

?

?

default.properties

?

记录了项目运行的环境信息,例如android的版本要求等。

?

????? 项目的总配置文件,记录应用中所使用的各种组件。这个文件列出了应用程序所提供的功能,在这个文件中,你可以指定应用程序使用到的服务(如电话服务、互联网服务、短信服务、GPS服务等等)。另外当你新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此Activity。AndroidManifest.xml将包含如下设置:application permissions、Activities、intent filters等。

?

?

?

?

?

?

?

一: Android 项目的目录结构

?

  1. ?? Android 项目结构概览。其实 Android 项目的目录结构和 Java 的差不多,没有太大变化,如下图:
  2. ????? 可以看到 src 文件夹里的是源文件, Android2.2 是引用的类库,这些和 java 的都一样,那么下面的这个 gen 是什么呢?这个里面的类就是 ADT 自动生成的啦,一般只有一个 R.java 文件,是不能修改的,那么他是怎么生成的呢,看到下面的 res 文件夹了吗? R.java 就是根据资源文件夹 res 生成的 ,R.java 里放的就是 res 中资源文件索引,用一个常量标记 res 中的一个资源文件,便于我们在代码中引用。 ?
  3. ?? 现在让我们看看 res 文件夹,这下面又有几种类别,其中 drawable 是放图片的,有 drawable-hdpi,drawable-ldpi,drawable-mdpi 之分,对应的是高密度图片,低密度图片,和中等密度的图片,如果你要使用一个图片,你根据密度的不同做了三种相同的图片分别放到这三个文件夹 里,那么你的应用运行在不同分辨率机器上的时候,就会根据该机器的分辨率自动选择合适的图片,怎么样智能吧!下图是密度和手机尺寸对应关系表。?

    Layout 中放的就是布局文件了, Android 支持通过 xml 生成视图,这样视图就和逻辑控制的代码分离了便于管理。

    Values 中放的就是我们常用的字符串,颜色值,数组等 .

    其实资源文件还有多种,这里生成的 HelloWorld 结构中没有,比如动画 , 菜单等。

    接下来的这个 AndroidManifest.xml 很重要,每个 Android 项目都有一个,这是 Android 的配置文件,我们可以在这里配置应用的属性,定义 Activity ,声明使用的权限等等,这里就不具体介绍,后面的章节会讲到 .default.properties 也是一个配置文件。

?

二: Android 项目文件的具体讲解

?

  1. ? 首先看这个 HelloWorld 类。

?

Java代码 ?
  1. public?class?HelloWorld?extends?Activity?{??
  2. ????/**?Called?when?the?activity?is?first?created.?*/??
  3. [email protected]
  4. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  5. ????????super.onCreate(savedInstanceState);??
  6. ????????setContentView(R.layout.main);??
  7. ????}??
  8. }??

?

他继承了 Activity ,前面讲了,一个 Activity 可以想象成一个手机的屏幕,用于展示一屏的内容,所以所有要展示内容的屏幕都要继承 Activity 才能实现,接着覆盖了 onCreate() 方法对该 Activity 进行初始化 setContentView(R.layout.?main?); 设置了使用 main.xml 这个布局文件作为当前 Activity 的内容展示 .main.xml 就是放在 res 下, layout 下面的文件 xml 布局文件 , 我们可以直接使用 R.layout.main 进行直接的引用他,这也是 Android 亮点的地方,省得我们为了引用一个 xml 文件再使用 File 类去读取,我们要做的只是把这个 xml 文件的索引给 Android ,他会自动的帮我们找到它并使用 .

?2. main.xml 布局文件

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>??

?

布局文件的内容不多 , 开始就是一个 LinearLayout 组件的定义,然后在这个 LinearLayout 放了一个用于显示文字的 TextView 。现在来看一下几个参数 :

  • .????? LinearLayout 一个线性布局面板,只能垂直和水平布局, android:orientation="vertical" 代表里面的子元素只能垂直排列,而使用 android:orientation="horizontal"?就标识里面的子元素水平排列?..
  • .????? android:layout_width 定义当前视图占的宽度,这里是 fill_parent 即为充满整个屏幕。而设置成 wrap_content 会根据当前视图的大小只能的改变宽度
  • .????? android:layout_height 是定义视图的高度,这里也是填充整个屏幕。而设置成 wrap_content 会根据当前视图的大小只能的改变高度。
  • .????? android:text 是这是 TextView 要显示的文本,可以是字符串,也可以是一个字符串的引用,这里是一个引用,引用的是 strings.xml 定义好的名字为 hello 的字符串

3.????? string.xml 介绍。

Xml代码 ?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <resources>??
  3. ????<string?name="hello">Hello?World,?HelloWorld!</string>??
  4. ????<string?name="app_name">HelloWorld</string>??
  5. </resources>??

?

这里我们看看就明白了,只要是定义一个个的 K-V 的键值对,供其他地方使用。比如上面的 main 中对 hello 的引用。这对字符的统一管理和国际化有很大的意义。

?

4.????? AndroidManifest.xml 的介绍

Xml代码 ?
  1. <manifest?xmlns:android="http://schemas.android.com/apk/res/android"??
  2. ??????package="com.flysnow"??
  3. ??????android:versionCode="1"??
  4. ??????android:versionName="1.0">??
  5. ????<application?android:icon="@drawable/icon"?android:label="@string/app_name">??
  6. ????????<activity?android:name=".HelloWorld"??
  7. ??????????????????android:label="@string/app_name">??
  8. ????????????<intent-filter>??
  9. ????????????????<action?android:name="android.intent.action.MAIN"?/>??
  10. ????????????????<category?android:name="android.intent.category.LAUNCHER"?/>??
  11. ????????????</intent-filter>??
  12. ????????</activity>??
  13. ??
  14. ????</application>??
  15. ????<uses-sdk?android:minSdkVersion="8"?/>??
  16. ??
  17. </manifest>??

?

这是项目的重要配置文件,诸如 Activity ,权限, Intent 等都在这里配置

Package: 定义了该应用的包。

android:versioCode 定义了应用的版本号

android:versionName 定义了应用的版本名字

application 标签定义了一个应用,一个项目最多有一个 Application 标签。

android:icon="@drawable/icon"?定义了应用的图标?引用资源文件中的?icon?图片

android:label="@string/app_name"?定义了应用的名称

activity?标签定义了一个?Activity?,你的每一个?Activity?必须在这里定义,否则不能运行?.

Android:name?定义了?Activity?的类名?,?这里的?.HelloWorld?是以上面的?Package?定义为基础的,也就是?Package(com.flysnow)?加上这个?android:name(.HelloWorld)?要能定位到这个?Activity(com.flysnow.HelloWorld)?,否则就是找不到?.

android:label 定义了该 Activity 的标题

?

intent-filter 定义一个 Intent 过滤器,用于标记对应的 Activity ,以便 Android 系统能找到该 Activity ,定义的是隐性的 Intent ,主要使用两个子标签 action 和 category 来区分每个 Intent 。

?

?

?

?

?

?

?

?

?

  相关解决方案