第一个Android的应用程序目录结构详说

http://www.linuxidc.com/Linux/2011-12/48964p2.htm:
http://www.linuxidc.com/Linux/2011-12/48964.htm
结构图:

从上往下一一介绍:

1、  src文件夹一看就是放源代码的,自己编写的!!

2、  gen下有跟src中一样的包文件,包文件有一个R.java类,它是自动生成的一个类;该目录不用我们开发人员维护, 但又非常重要的目录 。 该目录用来存放由 Android 开发工具所生成的目录 。 该目录下的所有文件都不是我们创建的,而是由ADT 自动生成的。该目录下的 R.java 文件非常重要;

R.java 文件中默认有 attr 、 drawable 、 layout 、 string 等四个静态内部类 , 每个静态

内部类分别对应一种资源, 如 layout 静态内部类对应layout 中的界面文件, 其中每个静态内部类中的静态常量分别定义一条资源标识符,如 “ publicstatic final int main =0x7f030000; ” 对应的是 layout 目录下的 main.xml文件。具体的对应关系,如下图。


现在已经理解了 R.java 文件中内容的来源 , 也即是当开发者在 res/ 目录中任何一个子目录中添加相应类型的文件之后, ADT 会在 R.java 文件中相应的匿名内部类当中自动生成一条静态 int 类型的常量,对添加的文件进行索引。如果在 layout 目录下在添加一个新的界面,那么在 public static final class layout 中也会添加相应的静态 int 常量。相反的 , 当我们再 res 目录下删除任何一个文件 , 其在 R.java 中对应的记录会被 ADT 自动删除 。再比如说我们在strings.xml添加一条记录,在R.java 的 string 内部类中也会自动增加一条记录。

R.java 文件会给我们开发程序带来很大的方便 , 比如在程序中我们使用 “ public staticfinalint icon =0x7f020000; ”就可以找到其对应的 icon.png 这幅图片。

R.java 文件除了有自动标识资源的 “ 索引 ” 功能之外 , 还有另一个主要的功能 , 当 re s目录中的某个资源在应用中没有被使用到 , 在该应用被编译的时候系统就不会把对应的资源编译到该应用的 APK 包中,这样可以节省 Android 手机的资源。

3、  android 2.1/ 存放 Android 自身的 jar 包。

4、  assets/该目录用来存放应用中用到的类似于视频文件、 MP3 一些媒体文件。

5、  res/  res 是 resource 的缩写 。 我们称该目录为资源目录 。该目录可以存放一些图标、界面文件、应用中用到的文字信息。

res/目录下有三个 dawable 文件夹 -- drawable-*dpi, 区别只是将图标按分辨率高低来放入不同的目录 ,drawable-hdpi用来存放高分辨率的图标, drawable-mdpi 用来存放中等分辨率的图标, drawable-ldpi  用来存放低分辨率的图标 。 程序运行时可以根据手机分辨率的高低选取相应目录下的图标。这些文件夹下放一些png扩展名的图片,png是透明的压缩的图片;专门针对网络制出的图片,因为它的尺寸很小效果很好!!移动平台上一般都用png;

如果是老版本的,比如是1.5版本的,res下的drawable只有一个文件夹,过去的版本没有分辨率之分,如果想改变老版本的,所这三个文件添上就可以了!!

res/目录下layout/的文件main.xml是布局文件,

main.xml

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

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

android:orientation = "vertical"

android:layout_width = "fill_parent"

android:layout_height = "fill_parent"

< TextView

android:layout_width = "fill_parent"

android:layout_height = "wrap_content"

android:text = "@string/hello"

/>

</ LinearLayout >

我们逐元素进行分析说明:

<LinearLayout> 元素

“LinearLayout ”翻译成中文是 “ 线性布局 ” ,所谓线性布局就是在该元素下的所有子

元素会根据其 “ orientation ” 属性的值来决定是按行或者是按列逐个显示。

<TextView > 元素

该元素与 HTML 中的 < label> 元素比较相似。也是一种显示控件。

其属性 text 指定在该元素上面显示的文字内容。建议将该文字内容在 strings.xml 文件;

values/下有一个strings.xml文件,用来定义字符串和数值 , 在 Activity 中使用 getResources().getString(resourceId)或getResources().getText(resourceId) 取得资源。

HelloWorld 项目的 strings.xml 文件内容如下:

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

< resources >

< string name = "hello" > Hello World,HelloActivity! </ string >

< string name = "app_name" > Android ,你好! </string >

</ resources >

每个 string 标签声明了一个字符串,name 属性指定其引用名。

为什么需要把应用中出现的文字单独存放在strings.xml 文中呢?

原因有二,一是为了国际化,二是为了减少应用的体积,节省空间;

6、  AndroidManifest.xml: 该文件是功能清单文件,该文件列出了应用中所使用的所有组件; 

AndroidManifest.xml主要包含以下功能:

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

? 描述应用程序的组件 -- 活动、服务、广播接收者、内容提供者;对实现每个组件

和公布其功能 ( 比如 , 能处理哪些意图消息 ) 的类进行命名 。 这些声明使得 Androi d

系统了解这些组件以及它们在什么条件下可以被启动;

? 决定应用程序组件运行在哪个进程里面;

? 声明应用程序所必须具备的权限,用以访问受保护的部分 API ,以及和其它应用程

序交互;

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

? 列举测试设备Instrumentation 类,用来提供应用程序运行时所需的环境配置及其

他信息,这些声明只在程序开发和测试阶段存在,发布前将被删除;

? 声明应用程序所要求的 AndroidAPI 的最低版本级别;

? 列举application 所需要链接的库;

AndroidManifest.xml

<? xmlversion = "1.0" encoding = "utf-8" ?>

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

package ="com.sharpandroid.activity"

android:versionCode= "1"

android:versionName= "1.0" >

<application android:icon = "@drawable/icon"

android:label= "@string/app_name" >

<activity android:name = ".HelloActivity"

android:label= "@string/app_name" >

<intent-filter >

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

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

</intent-filter >

</activity >

</ application >

< uses-sdkandroid:minSdkVersion = "7" />

         1. <manifest> 元素

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

package ="com.sharpandroid.activity"

android:versionCode = "1"

android:versionName = "1.0" >

该元素是 AndroidManifest.xml 文件的根元素, 该元素为必选 。 其中根据 xml 文件的语

法, “xmlns:android ”指 定 该 文 件 的 命 名 空 间 。 功 能 清 单 文 件 会 使 用 “http://schemas.android.com/apk/res/android” 所指向的一个文件 。 “ package ” 属性是指定 Android 应用所在的包 , 以后会经常说到 “ 应用的包 ” , “ 应用的包 ” 就是指该属性的内容 。“android:versionCode ”指定应用的版本号。 如果应用需要不断升级 , 在升级的时候应该修改该值 。 “ android:versionName” 是版本名称,名称的取定可根据爱好而定。

2. <application> 元素

< application android:icon ="@drawable/icon"

android:label ="@string/app_name" >

< activity android:name =".HelloActivity"

android:label ="@string/app_name" >

< intent-filter >

< action android:name = "

android.intent.action.MAIN" />

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

</ intent-filter >

</ activity >

</ application >

<application> 是非常重要的一个元素,今后我们开发的许多组件都会在该元素下定义的。该元素为必选元素。<application> 的“ icon ”属性是用来设定应用的图标。该表达式指向的是 icon.png 图片。 在 Eclipse 中双击 icon.png 图片 , 如下图 。 对照关系如下图:


<application> 的 “ label ” 属性用来设定应用的名称。指定其属性值所用的表达式

“ @string/app_name ”含义与上面的表达式“ @drawable/icon ”一样,同样是指向 R.jav a文件中的 string 静态内部类中的 app_name 属性所指向的资源。在这里它指向的是

“ strings.xml ”文件中的一条记录“ app_name ”,其值为 “ hello world! ” ,因此,这种表达方式等价于android:label = " hello world ! " 。

两者结合起来,当程序发布到模拟器上之后,会在“ 抽屉 ” 中显示效果,如下。


3. <activity> 元素

<activity> 元素的作用是注册一个Activity 信息, 当我们在创建 “ HelloWorld ” 这个项

目时,指定了【 Create Activity 】属性为“ HelloActivity ”,之后 ADT 在生成项目时帮我们自动创建了一个 Activity 名称就是“ HelloActivity.java ”, Activity 在 Android 中属于组件,它需要在功能清单文件中进行配置。

<activity> 元素的 “ name ” 属性指定的是该 Activity 的类名 。 我们可以看到这个属性值“.HelloActivity ”中的 “ . ” , “ . ” 代表的是在上面<manifest> 元素的“ package ”属性中指定的当前包。因而“ .HelloActivity ”的含义等价于“ com.sharpandroid.activity.HelloActivity.java ” 。如果 Activity 在应用的包中 , 则这个 “ . ” 可以去掉 , 但如果 Activity 不在应用的包中 ,而在应用的包的子包当中,如下图中的 OtherActivity 这个 Activity 配置时必须这么写“ .sub.OhterActivity ”, “ . ” 不可省略。因此建议在书写时不论何种情况都加上 “ . ” ,以免出错。


Activity 只能放在 “ 应用的包 ” 或者其子包里面,而不能在 “ 应用的包 ” 以外的包中 。这一点必须牢记。

4. <intent-filter> 元素

翻译成中文是“ 意图过滤器 ” 。首先简单介绍什么是意图( Intent ) 。应用程序的核心组件 ( 活动 、 服务和广播接收器 ) 通过意图被激活 , 意图代表的是你要做的一件事情 , 代表你的目的 , Android 寻找一个合适的组件来响应这个意图 , 如果需要会启动这个组件一个新的实例,并传递给这个意图对象。后面会有详细的介绍,在此只需有大致印象即可。组件通过意图过滤器( intent filters )通告它们所具备的功能-- 能响应的意图类型 。由于 Android 系统在启动一个组件前必须知道该组件能够处理哪些意图 , 那么意图过滤器需要在 manifest 中以<intent-filter> 元素指定。 一个组件可以拥有多个过滤器 , 每一个描述该组件所具有的不同能力 。 一个指定目标组件的显式意图将会激活那个指定的组件 , 意图过滤器不起作用 。 但是一个没有指定目标的隐式意图只在它能够通过组件过滤器任一过滤器时才能激活该组件。

第一个过滤器--

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

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

是最常见的。它表明这个 activity 将在应用程序加载器中显示,就是用户在设备上看到的

可供加载的应用程序列表。换句话说,这个 activity 是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个 activity 。

5. 权限 Permissions

Permissions是一个非常重要的节点,Permission是代码对设备上数据的访问限制,这个限制被引入来保护可能会被误用页破坏用户体验的关键数据和代码。如拨号服务,短信服务等。每个许可被一个唯的标签所标识,这个标签常常指出了受限的动作。

比如:今天做了一个申请拔打电话的服务权限需要在功能清单文件中添加如下语句:

<uses-permissionandroid:name="android.permission.CALL_PHONE"/>

下面是一些Android定义的权限:


一个功能( feature )最多只能被一个权限许可保护。如果一个应用程序需要访问一个

需要特定权限的功能,它必须在 manifest 元素内使用 <uses-permission> 元素来声明这一

点。 这样 , 当应用程序安装到设备上之后 , 安装器可以通过检查签署应用程序认证的机构来决定是否授予请求的权限 , 在某些情况下 , 会询问用户 。 如果权限已被授予 , 那应用程序就能够访问受保护的功能特性 。 如果没有 , 访问将失败 , 但不会给用户任何通知 。 因此我们在使用一些系统服务,如拨号、短信、访问互联网、访问 SDCard 时一定要记得添加相应的权限,否则会出现一些难以预料的错误。

7、  / manifest >Procuard.cfg混淆器,就是让你的代码进行加密和压缩代码,java代码编译成class文件,java代码也很规范,有时候代码不想让别人知道,就利用混淆器把源代码编译时改了,把那些名字改的乱其八糟的,使人无法阅读,它会把那些长名字改成a了b了,这样就减少字节了压缩了代码!!

8、  Project.properites配置文件建项目的时候自己就配置了版本信息

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-12/48964.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值