背景:这一篇在我个人理解里面是我之前一直想学Android但是总找不到切入点的根本原因之一,就像我做php开发搭开源框架的时候,如果该框架没有对文件结构的分析,那么我就肯定不会清楚我应该按照什么样的规则去写我自己的代码。折射过去后,就是如果我理解了Android项目的文件结构各部分都是做什么的,那么我自然就知道我的代码应该写在什么位置,也会清楚了我写的代码会影响到哪些内容或者展示什么样的内容。
我个人的理解就不多说了,这种感触一般自己体会最有影响,下面就上一篇创建的HelloWorld最原始项目结构。copy出《Android4编程入门经典》书籍里的关于项目文件结构分析的部分。
HelloWorld项目展开后文件结构如下图
src ------ 包含项目的.java源文件。在上面的HelloWorld项目src里面有一个文件:MainActivity.java(这个文件可能不太一样,在命名的时候我有自己设置)。MainActivity.java文件时活动的源文件,我们将会在这个文件中编写应用程序的代码。这个Java文件在项目的包名是:com.example.helloworld。
gen ------ 包含了由编译器生成的 R.java 文件,它引用在项目中能找到的全部资源。不要修改此文件。项目中的所有资源会自动编译到这个类中,所以可以使用这个类引用它们。
Android 4.3库 ------ 这一项中有一个android.jar文件,包含了一个Android应用程序所需的所有类库。
assets ------ 这个文件夹包含了应用程序所用到的所有资产,例如HTML、文本文件、数据库等。
bin ------ 这个文件夹包含了生成过程中 ADT 生成的文件。特别是,它会生成 .apk 文件(Android包)。 .apk 是Android应用程序的二进制文件,包含运行Android应用程序所需的一切。
res ------ 这个文件夹包含了应用程序中所使用的所有资源。它还包含了几个子文件夹:drawable-<resolution>、layout和values。(书籍后面会有详细描述,待看到后再补充会介绍到如何支持具有不同屏幕分辨率和像素密度的设备)。
AndroidManifest.xml ------ 这是Android应用程序的清单文件。在这一文件中,可以指定应用程序所需的权限,还可以指定其他特性(如意图筛选器、接收者等)。(书籍后面会有关于这个文件详细的说明,后面补充)。
到此关于项目结构的分析(重要文件夹和文件的作用)算是copy完了,下面要描述的对于重要文件的解析。
首先是 res/layout/main.xml 文件(main.xml文件定义了活动的用户界面)内容如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"需要注意的代码为 倒数第二行的 android:text="@string/hello_world" />
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
在这行代码里,@string 指的是位于 res/values 文件夹下的 strings.xml 文件。因此,@string/hello_world 指的是在 strings.xml 文件中定义的 hello_world 字符串,即 "Hello world!" strings.xml 文件内容如下:
<?xml version="1.0" encoding="utf-8"?>书籍里建议将应用程序中所有的字符串常量存储于这个 strings.xml 文件中,并用@string 标识符引用这些字符串。这样,如果需要将您的应用程序本地化为另一种语言,则只需要备份整个 values 文件夹,并用目标语言替换 strings.xml 文件中存储的字符串。如下图,使用了另外一个名为 values-fr 的文件夹,其 strings.xml 文件中包含用法语表示的相同的 hello_world 字符串。
<resources>
<string name="app_name">HelloWorld</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
</resources>
如果用户在一台被配置为默认显示法语的手机上加载这个应用程序,应用程序将自动显示法语表示的 hello_world 字符串。在Android项目中,下一个重要的文件是清单文件。观察一下 AndroidManifest.xml 文件的内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.helloworld.MainActivity"
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>
</manifest>
1.定义了应用程序的包名:com.example.helloworld。
2.应用程序的版本代码(通过android:versionCode 属性设置)。这个值是用来标识应用程序的版本号。它可用于以编程方式确定应用程序是否需要升级。
3.应用程序的版本名称是1.0(通过android:versionName 属性设置)。此字符串值主要用来显示给用户。这个值应该采用以下格式:<major>.<minor>.<point>。
4.<uses-sdk>元素的 android:minSdkVersion 属性指定了应用程序运行所需的操作系统最低版本。
5.应用程序使用位于 drawable 文件夹下的图像ic_launcher.png。
6.应用程序的名称是在strings.xml 文件中定义的名为 app_name 的字符串。
7.HelloWorldActivity.java 文件代表了应用程序中的一项活动。代表这项活动的标签名称与应用程序的名称相同。
8.在这项活动的定义中,有一个名为<intent-filter>的元素:
a.意图筛选器的动作名称为 android.intent.action.MAIN,表明了这项活动是应用程序的入口点。
b.意图筛选器的类别名称为 android.intent.category.LAUNCHER,表明了应用程序可从设备的启动器图标启动。(意图的详细内容后续给出)
备注:在向项目中加入更多的文件和文件夹后,Eclipse将自动生成 R.java 的内容(不要手动修改这个文件里的内容)。当我们修改项目时,Eclipse会自动生成相应的内容。(如果手动删除了R.java文件,Eclipse会立即重新生成一个。注意,为了使Eclipse可以生成R.java 文件,项目里不能包含任何错误。如果在删除R.java 后发觉Eclipse没有重新生成这个文件,那么就需要再检查一遍项目。代码中可能包含语法错误或者XML文件(如AndroidManifest.xml、main.xml等)的格式不良好)。
最后,把活动连接到用户界面(main.xml)的代码是位于 HelloWorldActivity.java 文件中的 setContentView() 方法:
package com.example.helloworld;这里,R.layout.main 指的是位于 res/layout 文件夹下的 main.xml 文件。在向 res/layout 文件夹添加额外的 XML文件时,R.java 中将自动生成这个文件名。onCreate() 方法是活动加载时被调用的多个方法之一。(后面将详细讨论活动的生命周期)。
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
到此,关于一个 Android 项目的文件结构分析大致理清了,我copy书籍原文的本意主要是为了加强自己的理解,到现在我第一感觉是 Android 这种绘制界面的流程和我以前做java web开发时接触到的GWT 很相似。