编写目的 | 编写日期 | 编写者 | 备注 |
掌握开发一个Android应用程序的基本框架 | 2010-7-21 | 吴自超 | 基础知识 |
目录
1 引言 - 4 -
2 Hello工程如何创建 - 4 -
3 Hello工程结构分析 - 6 -
3.1 整理说明 - 6 -
3.2 目录src - 7 -
3.3 目录gen - 7 -
3.4 目录Android2.2 - 8 -
3.5 目录assets - 8 -
3.6 目录res - 8 -
3.7 文件androidmanifest.xml - 8 -
3.8 文件default.properties - 9 -
4 Hello工程如何执行 - 9 -
5 Hello工程深入理解 - 11 -
6 Hello工程提高练习 - 13 -
7 Android程序包说明 - 16 -
8 Android资源如何来 - 16 -
8.1 Android SDK与ADT插件下载地址 - 16 -
8.2 Eclipse For Java下载地址 - 16 -
8.3 Java Development Kit下载地址 - 17 -
8.4 Android SDK开发社区 - 17 -
8.5 Android SDK中文开发网 - 17 -
8.6 Android应用开发指导书籍推荐 - 17 -
1引言
为了阐述在Android系统上开发应用程序的基本框架,我们还是以一个在手机屏幕上显示Hello字符串的应用程序为案例来分析。程序产生的效果如下:
这里的开发环境在windows下,用eclipse + ADT + Android SDK2.2来开发Android应用程序。为何会有上面的效果,下面一步一步来探索吧!
2Hello工程如何创建
在《Android应用开发入门》中已经阐述如何新建一个工程,为了熟悉这个步骤,我们下面还是从开始做起,假设这里是我们的开发环境已经配置完善,在eclipse的开发界面下,我们选择新建一个Android项目如下图:
在点击Android Project菜单之后,弹出的对话框的选项,是我们在新建一个Android项目的关键内容填写项,界面如下图所示:
上述的对话框主要包含四部分:
Project name | 工程名称,这里我们填写:Hello |
Contents | Create new project in workspace 创建一个新的工程,由于是新建工程,选择此项 Create project from existing source 从一个已经存在项目来创建工程,类似导入 Use default location 是否使用用户默认的目录,工程存放目录,一般采用默认 Create project from existing sample 从SDK中的案例中创建,暂时不用 |
Build Target | 主要是选择SDK中提供的Android开发版本,目前最新版已经2.2,这里选择Android 2.2,主要是程序运行时需要的开发包版本,运行平台,API版本号等内容。 |
Properties | Application name 执行程序的名称,也是在手机上安装的软件名称 Package name 应用程序的java文件的包,可以借鉴java包命名规则这里定义为: com.mobile.test.hello Create Activity 这个项很重要,是我们手机界面主类,继承Activity类,填写后自动在包下面生成以此名称的类。例如输入:Hello,那么在包下面会产生一个Hello.java文件。 Min SDK Version 说明软件运行的最低版本要求,主要根据你选择的SDK版本来决定,对应于你SDK中的API Level的值,这里写8 |
3Hello工程结构分析
3.1整理说明
一般一个工程文件都包含一堆的东西,有很多目录,很多的文件,那么这些目录与文件是如何组织,如何工作的呢?为了很好的开发与应用,我们必须要掌握他们相互之间的关系,基本组织结构。首先用下面一个图来简单描述一下Hello工程的基本构成:
下面来讲述一下每一个目录与文件的含义与主要作用,我们要学会Android应用程序编写,当然需要了解与掌握每个文件与目录的作用。就如我们在图书馆找一本书一样,我们需要了解图书馆的摆放规则与每个提示牌的作用。这里也是一样的,新建一个工程,生成了一堆的文件,到底每个文件如何使用,这是我们必须关注与掌握的。
3.2目录src
首先我们来看这个目录src,他是专门存放应用程序java源码的地方,我可以展开src目录在包com.mobile.test.hello下面找到新建工程Hello自动生成的Hello.java文件。以后的开发代码,编写基本上都在这个目录下进行。
3.3目录gen
目录gen是存放Android应用程序自动生成的资源文件控制R类文件的,这个R类会根据资源文件信息的变化自动更新,一般不需要人为的修改,只要知道使用即可以,主要作用就是把工程中添加的文件实例化一个个内部类。他的包名和目录src的包名一致,作用类似一个索引。
3.4目录Android2.2
目录Android2.2主要是存放SDK的jar包,是根据新建工程时候选用的SDK版本来确定,是一个引用的模式,指向SDK开发版本目录下的jar包。
3.5目录assets
目录assets主要存放系统自身的一些资源文件,一般情况下都为空,不需要编辑。
3.6目录res
目录res主要用来存放各类资源文件,主要包含的子目录有drawable, layout, values, anim, menu, xml每个子目录摆放文件说明如下:
目录drawable | 主要资源有三类:位图文件(Bitmap File), 颜色(Color Drawable),九片图片(Nine-Patch Image) 最常用是位图文件,主要支持三类:png, jpg, gif |
目录layout | 主要存放手机界面显示的布局文件,也就是控件显示在什么位置,主要布局有下面几种: LinearLayout线性布局-水平,垂直 TabelLayout表格布局-表格模式 FrameLayout帧格布局-画格模式 RelativeLayout相对布局-控件之间相对 AdsoluteLayout绝对布局-控件位置绝对 |
目录values | 主要用来存放一些资源变量值的配置文件主要有,颜色(color),字符串(string),尺寸(dimen)等。 |
目录anim | 主要存放动画的资源文件 |
目录menu | 主要存放菜单文件,常用菜单有选项菜单,上下文菜单,子菜单。 |
目录xml | 自定义的XML原始资源文件,比如系统配置信息,或者数据库配置信息等。 |
文件AndroidManifest.xml是Android应用程序的资源清单文件,主要包含程序启动入口,资源声明,权限控制,用户引用库,运行版本信息等。这个文件名称是自动生成的,并且一般不要修改,否则程序启动要出错。现在打开这个文件是不是可以到如下内容:
android:versionCode="1" android:versionName="1.0">
第一行是XML说明信息,第二行开始是对Android应用程序的资源的说明,运行的包,程序版本,应用程序的log与名称,应用程序的入口类,应用程序的名称与标题名称,运行的SDK版本信息,如果有多个activity那么必须在这个文件说明,上述的案例只有一个Hello的activity,如果还有一个Second的activity,那么配置文件在之前增加内容如下:
其他详细的内容在后面慢慢的讲解。
3.8文件default.properties
文件default.properties是Android开发工具自动生成的一个配置信息文件主要类容就是说明SDK开发包版本,一般情况无需编辑与修改。
Hello工程的结构分析到此告一个段落,虽然这个工程很简单,很小,但是需要用到的东西与常用的资源都用到了。
4Hello工程如何执行
我们回忆一下以前的程序,无论是c/c++程序,还是java程序,运行的时候一般都是从main函数开始执行,但是Android应用程序我们好像没有看见main这个入口函数,那我们该如何执行我们的程序?我们来打开Hello.java,代码如下:
package com.mobile.test.hello;
import android.app.Activity;
import android.os.Bundle;
public class Hello extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
你一定也觉得比较奇怪,没有我们想象的main函数入口,只是继承了Activity类,其实Android的入口由资源清单文件AndroidManifest.xml中的这个
那么我们现在来看看是不是这样执行的?在Hello.java工作区域点击右键选择弹出菜单的运行方式下子菜单的运行配置得到如下:
双击Android Application选项,得到如下界面:
在Project 输入工程名称Hello,点击下面的运行按钮,看看我们的效果是不是我们前面的期待效果呢?可能因为机器的配置,启动模拟器的时间比较长。我运行的结果如下:
确实和我们期望的结果一样,在手机的屏幕上显示了Hello World, Hello!信息。
程序的标题也是Hello.
5Hello工程深入理解
程序结果执行出来,为何是这样呢?让我们进一步分析Hello工程,我们刚才已经分析了工程的基本文件,到底是那些文件决定了手机屏幕的显示呢?我们来到看我们的Hello.java文件里面的内容,代码基本上只有如下两句话:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
第一句话是调用父类的onCreate方法,与具体显示没有看出什么关系,第二句话是用布局文件main.xml设置当前视图, 因为在程序中引用资源的方式为R.资源类型.资源类名称,从这个程序上,我们也看不见为何在手机上要显示上面的类容?那我们去layout目录下打开main.xml文件看看,内容如下:
android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_height="wrap_content" android:text="@string/hello" />
上面我们已经介绍过布局,很清楚这是一个线性布局描述,布局的类型为:vertical(垂直),属性是布局宽度,高度(全屏)布局中有一个控件(TextView) 这里顺便说一下,常用控件如下列表:
TextView | 文本显示 |
EditView | 编进框显示,密码框显示 |
Button | 按钮 |
RadioButton | 单选按钮 |
ImageView | 图片显示 |
CheckBox | 复选框 |
Spinner | 下拉框 |
ListView | 下拉列表显示 |
GridView | 图片格控件 |
Gallery | 画廊控件 |
Toast | 提示框控件 |
看到这个应该大致明白了为何会显示:“Hello World, Hello!”内容了,标题为何是:“Hello”,刚才前面text的值是这样一个标签:@string/hello,表示的含义是找资源string下面名称为hello的值,我们再来看看文件AndroidManifest.xml的内容。
android:versionCode="1" android:versionName="1.0">
是不是发现里面也有类似的@string/app_name, @drawable/icon的东西呢,其实这就是Android应用程序开发中在配置文件中对变量的一种访问格式,那这样应用为什么没有出错呢?如何判定这样引用的值是存在的呢?那我们就得查看前面提到的R类文件,打开R类文件,内容如下:
package com.mobile.test.hello;
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.layout.main了。这个R类就是把我们的工程的资源文件整理生成了一个个内部类,在程序中可以直接通过这个R.资源类型.资源名称来引用,在配置文件中通过@资源类型.资源名称的方式引用。
到此我们对Hello工程中每部分的关系分析以及基本完成,至少我们要了解手机如何显示,显示是如何控制,程序中如何引用资源,配置文件中如何引用资源,非常重要的R类等知识。
6Hello工程提高练习
我们现在有一张图片,如图所示,实现如下应用,在手机上居中显示内容为:“有背景的Hello”,背景图片用上图,效果如下:
是不是觉得内容显示很简单了,直接找到strings.xml中的hello对应的值给替换为想要显示的内容“有背景的Hello”就OK了,但是问题又来了,如何居中显示?如何使用背景图片?
如何解决居中显示问题?从这个字面的分析,只是一个显示问题,肯定是用布局就给摆平了,那么我们去调整布局文件main.xml中的TextView,增加一个属性:android:gravity="center",这个表示控件内容在布局区域的显示位置,主要取值有:top, bottow, left, right, center等,这个里面有很多属性控制,都可以在布局上设置。当然也可以用程序设置,一般常用的简单设置建议采用布局配置文件来设置,对代码维护性方便,如果是复杂的处理与变换建议采用代码来实现,方便处理。
如何解决背景图片的问题呢?首先我们要装入这个背景图片资源,如何处理呢?把图片考入res目录下的子目录drawable(目录drawable如果不存在请创建),添加之后我看看R类的内部类drawable类中是不是增加了一条信息:public static final int andbk=0x7f020000;这就自动增加的声明资源文件上面提到过,在程序应用它可以直接R.drawable.andbk的方式。那么我们在Hello.java中来设计背景图片,调用设置背景函数: getWindow().setBackgroundDrawableResource(R.drawable.andbk); 这个是当前屏幕的背景函数。那么我们修改我们的Hello.java代码如下:
package com.mobile.test.hello;
import android.app.Activity;
import android.os.Bundle;
public class Hello extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setBackgroundDrawableResource(R.drawable.andbk);
setContentView(R.layout.main);
}
}
问题处理完毕,我们来测试一下,是不是满足我们的需求呢?那就执行起来看看结果,结果显示如下:
得到了我们的效果,是不是觉得Android程序开发并不是我们想象中那么困难呢,还是比较容易的就设计出自己想要的效果,当然这只是一个入门程序,里面还有很多东西需要我们去仔细研究与掌握,才能设计出功能非常强大与操作性较强悍的Android应用程序。
7Android程序包说明
Android应用程序是以后缀名apk结束的,它是运行在Dalvik虚拟机上,和真正的java虚拟机有点区别,我们可以通过SDK中提供的工具adb命令来安装与卸载应用程序,如安装adb install Hello.apk,可以通过手机卸载,或者直接删除执行程序,用户的执行程序一般都放在系统的/data/app目录下面.
程序打包基本过程如下:
8Android资源如何来
8.1Android SDK与ADT插件下载地址
http://androidappdocs.appspot.com/index.html
8.2Eclipse For Java下载地址
http://www.eclipse.org/downloads/
8.3Java Development Kit下载地址
http://java.sun.com/javase/downloads/
8.4Android SDK开发社区
http://www.oschina.net/p/android
8.5Android SDK中文开发网
http://www.android123.com.cn/zhongwensdk/
8.6Android应用开发指导书籍推荐
《Android基础教程》 美.伯内特 著 人民邮电出版社
《Android系统原理及开发要点详解》 韩超,梁泉著 电子工业出版社
《Android应用开发详解》郭宏志 编著 电子工业出版社
《Android应用开发揭秘》杨丰盛 著 机械工业出版社