2008年第8期
J I S UANJ I Y U X I A NDA I HUA
总第156期
文章编号:100622475(2008)0820085205
收稿日期:2008203217
作者简介:公磊(19842),男,江西南昌人,南昌大学计算机应用专业硕士研究生,研究方向:嵌入式系统;周聪(19622),男,副教授,研究方向:嵌入式系统。
基于Andr oid 的移动终端应用程序开发与研究
公 磊,周 聪
(南昌大学信息工程学院,江西南昌330031)
摘要:主要介绍了Google 新近推出的移动设备软件平台Andr oid 以及基于此平台的移动终端应用程序开发。关键词:移动设备;Andr oid;应用程序中图分类号:TP311 文献标识码:A
D evelop m en t and Research of M ob ile Term i n a ti on Appli ca ti on Ba sed on Andro i d
G ONG Lei,ZHOU Cong
(I nf or mati on Engineering School of Nanchang University,Nanchang 330031,China )
Abstract:The p ri m ary coverage is the Mobile equi pment s oft w are p latfor m of Google na med Andr oid and the devel opment ofMo 2bile ter m inati on app licati on based on Andr oid 1Key words:Mobile equi pment;Andr oid;app licati on
0 引 言
经过多年的发展,第三代数字通信(3G )技术获得了广泛的接受[1]
,它为移动终端用户带来了更快
的数据传输速率。随着3G 网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。Google 为此于2007年11月推出了一个专为移动设备设计的软件平台———Andr oid 。
Andr oid 是一套真正意义上的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Andr oid 最大特点在于它是一个开放的体系架构,具有非常好的开发和调试环境,而且还支持各种可扩展的用户体验,Andr oid 里面具有非常丰富的图形系统,对多媒体的支持功能和非常强大的浏览器[3]
。
Andr oid 平台的开放性等特点既能促进技术(包括平台自身)的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定特色化的产品,因此,它具有很大的市场发展潜力。
1 Andro i d 软件平台的构成
[2]
Andr oid 软件平台主要由五部分构成,它们分别
是:关键应用程序、应用程序框架和组件、C /C ++函数库、Java 程序运行环境、优化了的L inux 内核。
1.关键应用程序。
Andr oid 平台内包含一些关键应用程序,如邮件
收发客户端程序、短信收发程序、日历、网页浏览器等,而更多有特色的Andr oid 应用程序还有待于广大开发者共同参与开发。
2.应用程序框架及组件。
Andr oid 应用程序开发基于框架和组件。An 2dr oid 本身已在其框架中提供了许多组件供应用程序调用,开发者也可在开发应用程序时顺带开发新的组件,并将该组件放入应用程序框架中,以供自己和其它应用程序调用。
3.C /C ++函数库。
Andr oid 应用程序框架之下是一套C /C ++函数
库,它们服务于Andr oid 应用程序组件,其功能通过组件间接提供给开发者。这些函数库包括:标准C 函数库、媒体功能库、浏览器引擎、2D 和3D 图形库及
计 算 机 与 现 代 化2008年第8期
S QL ite引擎等。
4.Java程序运行环境。
Andr oid的Java程序运行环境包含一组Java核心函数库及Dalvik虚拟机,它们有效地优化了Java 程序的运行过程。
5.L inux内核。
Andr oid系统平台基于优化了的L inux内核,它提供诸如内存管理、进程管理、设备驱动等服务,同时也是手机软硬件的连接层。
2 Andro i d开发平台的配置和程序开 发的基本组件
Andr oid平台为开发者提供了源码开放的软件开发包(S DK),它包含了使用Java语言开发Andr oid平台应用的必要工具和组件(AP I)。进行开发前先要建立合适的开发环境,其中基于Java的整合型可扩展平台Ecli p se是我们的首选。
2.1搭建Ecli pse开发环境[5]
Ecli p se的运行建立在JRE之上,因此必须先安装JRE。可以从htt p://java.sun.com下载JDK5或JDK6,然后按提示进行JDK的安装;安装完成后,再配置环境变量:如在W indows XP或W indows2000的操作系统中,可右键单击“我的电脑”,然后依次选择“属性”\\“高级”\\“环境变量”,在弹出的窗口的“系统变量”中找到“Path”环境变量,点击“编辑”按钮,在弹出的对话框中的“变量值”一栏输入JDK的安装路径即可,最后用同样的方法设置环境变量“Class2 path”,至此便完成了JDK的安装。
有了Java运行环境,就可以下载Ecli p se ZI P包,解压后就能直接运行Ecli p se.exe。
在Ecli p se中安装一个名为ADT的Andr oid开发工具插件,就可以使用S DK进行Andr oid应用开发。ADT安装步骤:在Ecli p se中依次选择Hel p>Soft w are Updates>Find and I nstall,在弹出的对话框中选择Search f or ne w features t o install并点击Next,选择Ne w Re mote Site,在结果对话框中为远端站点命名(如ADT),并在URL栏中输入htt p s://dl-ssl.google. com/andr oid/ecli p se/,点击ok,随后ADT站点被添加到搜寻列表中,再点击Finish即可;在搜索结果对话框中选择ADT>Ecli p se I ntegrati on>Andr oid Devel op2 ment T ools,单击Next,接受协议,点击Next和Finish;选择I nstall A ll,并重启Ecli p se,ADT安装完成。
ADT安装完毕后,还要配置Ecli p se参数,使其指向S DK根目录,过程如下:在Ecli p se中选择W indo w
>Preferences打开参数设置面板,选择Andr oid选项;在S DK路径中填入Andr oid的安装路径,单击App ly和ok,完成参数设置。至此,就能在Ecli p se环境下进行Andr oid应用的开发了。
2.2Andro i d应用程序组件的使用
Andr oid应用程序以各种组件(AP I)为基础,AP I 是Andr oid软件平台的重要组成部分,也是开发An2 dr oid应用的关键所在。下面介绍几种主要的An2 dr oid AP I。
(1)当前活动程序Activity:作为最常用的应用程序组件,几乎所有Activity都会通过创建U I窗口与用户进行交流。Activity具有生命周期,它包含运行、暂停、停止等几个状态,状态间的转换可通过调用onCreate()、on2 Start()、onRestart()、onResu me()、onFreeze()、onPause ()、onSt op()、on Dest ory()等方法来实现。要开启新的activity,可以调用start A ctivity(I ntent),或调用startSub2 Activity(I ntent,int),后者通常和on Activity Result(int, int,String,Bundle)联合使用,以从一个activity获取某结果并返回给打开它的activity。
(2)图像显示V iew:V ie w是最基本的U I构件,它在屏幕中占据一个矩形区域可用来显示文本、图像等内容,还可完成图像事件处理。常用的V ie w方法有: inflate()(由X ML文件生成V ie w)、on D ra w(Canvas) (对V ie w进行填充)、on Measure(int,int)(测量V ie w 的高度和宽度)、on Layout()(完成V ie w的布局)、on2 Key Down(int,KeyEvent)(V ie w中有按键操作时被调用)、onFocus Changed(boolean,int)(当V ie w得到或失去关注时被调用)、set O nClilckL istener()(设置V ie w 点击事件)。V ie w也包含一些子类,如:Text2 V ie w(布局文件中的文本显示)、EditText(布局文件中的文本编辑)、Butt on(按钮)、L ist V ie w(显示列表)。
(3)事件I ntent:I ntent抽象描述了想要执行的某种操作,它与start A ctivity一起使用可以开启新的ac2 tivity,与startService一起使用可以开启后台服务。
I ntent最重要的作用还是加载activity,它是不同activ2 ity间的桥梁。I ntent也可以被认为是一种概括操作行为的数据结构,它主要包括acti on(动作)和data (数据)两部分,此外它还具有一些附加属性如cate2 gory(intent种类)、type(数据类型)等。常用的I ntent 方法有intent()(构造intent)、addcategory()(添加in2 tent类型)、get A cti on()(获取intent动作)、get D ata() (获取intent数据)等。
(4)数据存取与共享机制ContentPr ovider:Cont2
2008年第8期公磊等:基于Andr oid 的移动终端应用程序开发与研究87
entPr ovider 可实现应用程序的数据存取及不同应用
程序间的数据共享。ContentPr ovider 为应用程序提供
一些访问方法,包括:Query (U ri,String [],String,String[],String,String,String )(数据信息的查询),insert (U ri,Contentvalues )(在Content p r ovider 中添加
新数据),updata (U ri,Contentvalues,String,String[])
(更新Connt p r ovider 中的数据),delect (U ri,String,String[])(删除数据),Gettype (U ri )(获取数据类型)。其中,U ri 标明了ContentPr ovider 存储的数据类型,在执行访问方法时都需依据U ri 作为路径标识来确定要访问哪个ContentPr ovider 。
(5)后台服务Service:Service 是运行在后台的应用程序组件,不直接与用户交互。当前活动程序可以使用Context .StartService ()开启一项后台服务,还可以通过Context .bindService ()与后台服务通信。
3 Andro i d 应用程序开发例程
电话薄是一项必不可少的手机终端应用,本文以此为例来说明基于Andr oid 应用程序开发的基本过程。
3.1项目的创建
首先,在Ecli p se 中依次选择File >Ne w >Andr oid Pr oject,在弹出的“Ne w Andr oid Pr oject ”对话框的Contents 部分选择Create ne w p r oject in works pace,在“Pr oject na me ”后输入工程名Contactnote,在“Package na me ”后输入com.google .andr oid .contactnote,在“Ac 2tivity na me ”后输入Contactlist,在“App licati on na me ”
后输入Contact,最后点击Finish,完成电话簿项目的创建。
3.2项目源程序开发
电话簿源程序主要功能模块框架如下
:
图1 电话簿功能模块框架
(1)构建数据存取和共享机制ContactnotePr o 2vider 。
ContactnotePr ovider 是电话簿的数据存储及访问
组件,作为ContentPr ovider 的子类,它必须定义一个
唯一的字符串标识U ri 来指明自身存储的数据类型。ContactnotePr ovider 的U ri 可以这样定义:public static final U ri CONTENT _UR I =U ri .parse ("content://com.google .p r ovider .Contactnote /contactnotes")。
ContentPr ovider 可使用文件存储方式或S QL ite 2Database 来存储数据。本文选用了S QL ite Database 并
借助基于S QL ite 的类S QL ite OpenHel per 来构建电话簿存储系统:
p rivate static class DatabaseHel per extends S QL ite OpenHel p 2er {
public void onCreate (S QL ite Database db ){
db .execS QL ("CRE ATE T ABLE contactnotes (_id I N TE 2GER PR I M ARY KEY,"+"peop lena me TEXT,"+"phonen 2u mber TEXT,"+"modified I N TEGER"+");");
}//创建基于S QL ite Database 的电话簿数据表格phonen 2u mbers
Andr oid 平台内置了一套S QL ite 数据存储机制,
并包含了一系列管理S QL ite Database 的相关方法,如创建、打开数据库以及执行S QL 命令等,应用程序可直接使用这些方法来构建私有存储系统,在创建ContentPr ovider 时也可以借用这些方法。上面的代码
中,ContactnotePr ovider 就使用了基于S Q lite 的ex 2
ecS QL ()方法来构建电话簿的数据存储系统。本文之所以使用ContentPr ovider 来存储数据是因为只有它能实现数据共享,而其他存储系统的访问仅限于单个应用之内。
ContactnotePr ovider 实现数据共享的前提是能被
所有应用程序访问,因此它提供了一些公开的访问接口,应用程序调用这些访问接口时用U ri 标识确定访问路径。U ri 有两种形式,一种对应的是ContentPr o 2vider 中的所有数据内容,另一种对应了具体的某条(行)数据。以ContactnotePr ovider 为例,com.google .p r ovider .Contactnote /contactnotes 代表整个Contact 2notePr ovider 数据的访问路径,而com.google .p r ovid 2er .Contactnote /contactnotes/#则代表了具体某条(行)数据的访问路径,其中#指明行地址标号。
ContactnotePr ovider 访问接口的实现也可以借助
相关的S QL ite Database 方法,以下是实现Contact 2notePr ovider 数据更新接口的部分代码,它直接调用
了S QL ite Database 的update 方法:
public int update (U ri url,Content V alues values,String where,String[]where A rgs ){
int count;
s witch (URL_MAT CHER.match (url )){case NOTES:
计 算 机 与 现 代 化2008年第8期
count=mDB.update("notes
break;...
调用时只需通过U ri M atcher.match(uri)将数据更新接口U ri类型的路径参数解析为S QL ite Database 方法能识别的数据库表格形式。
(2)Activity程序的创建与编辑。
当前活动程序Activity通常可实现应用程序与用户的交互,本实例包含两个当前活动程序:电话本列表显示程序Contactlist和电话本编辑程序Contacte2 dit。
Contactlist是电话簿应用程序的入口,程序加载时将它开启。打开电话簿后首先看到的是按某种布局显示的联系人列表,列表内容和后台数据相对应。如果并未向后台数据库中添加任何信息,则列表显示内容为空,但列表的构架仍然存在。下面的代码部分实现了后台数据与列表内容显示的映射:
p r otected void onCreate(Bundle icicle){
super.onCreate(icicle);
...
mCurs or=managed Query(getI ntent().get D ata(),PRO2 JECTI O N,null,null);
L ist A dap ter adap ter=ne w Si m p leCurs or Adap ter(this,R. layout.contactlist_item,mCurs or,ne w String[]{Contactnote. contactnotes.PEP OP LE NAM E},ne w int[]{andr oid.R.id. text1});
set L ist A dap ter(adap ter);
}
首先通过managedQuery(getI ntent().get D ata (),PROJECTI O N,null,null)来获取指向后台数据的指针mCurs or,getI ntent().get D ata()和PROJEC2 TI O N共同决定了哪部分后台数据将被显示;然后,使用Si m p leCurs or Adap ter()来定义后台数据到前台显示的映射方式,其中R.layout.contactlist_ite m定义了列表的布局,Contactnote.contactnotes.PE OP LE NAME 指明显示内容为联系人姓名,andr oid.R.id.text指明姓名显示为文本;最后,通过set L ist A dap ter(adap ter)来激活映射。
光有列表显示还不足以实现Contactlist与用户的交流,真正的交互是通过创建可选菜单来完成的,而每个菜单选项都对应于用户的某种操作。Con2 tactlist使用onCreate Op ti ons Menu()来创建菜单: public boolean onCreate Op ti ons Menu(M enu menu){
super.onCreateOp ti ons Menu(menu);
menu.add(0,I N SERT_I D,R.string.menu_insert).set2Shortcut(’3’,’a’);
I ntent intent=ne w I ntent(null,getI ntent().get D ata());
intent.addCategory(I ntent.ALTERNATI V E_C ATEG ORY);
menu.add I ntent O p ti ons(Menu.ALTERNATI V E,0,new Component N a me(this,Contact L ist.class),null,intent,0, null);
return true;
}
可选菜单中,“添加”菜单项I nsert是被静态创建的,不管显示内容是否为空,该菜单项都存在。而对于那些在显示内容非空时才有意义的菜单项,可以用方法menu.add I ntent O p ti ons()来创建,这是一种动态创建方式,它创建的菜单项对应了某种事件intent。使用前先用intent.addCategory(I ntent.ALTERNA2 TI V E_CATEG ORY)将intent的类型设为ALTERNA2 TI V E_CATEG ORY或SELECT_ALTERNATI V E_CAT2 EG ORY,以表明这些intent及其对应的acti on是可以变化的。
电话簿程序应该具备响应内外事件的能力,如电话拔打程序或短信发送程序向电话簿索取号码时引发的事件。Contactlist必须先获取事件的acti on和data,然后依据acti on进行分类处理。acti on包括V I E W_ACTI O N(向用户显示数据)、MA I N_ACTI O N (开启入口程序)、E D I T_ACTI O N(提供编辑入口)、P I CK_ACTI O N(获取数据并返回)等不同类型。假如短信发送程序想从电话簿中获取号码,那么它会发出一个acti on类型为P I CK_ACTI O N的intent,Con2 tactlist接收并确认后执行set Result(RES ULT_OK, url.t oString()将号码返回。如果是程序内部菜单触发的编辑事件,那么Contactlist会使用start A ctivity (ne w I ntent(I ntent.ED I T_ACTI O N,uri))开启Con2 tactedit完成编辑工作。
Contactedit是电话簿中另一个交互程序,由Con2 tactlist的添加或编辑事件引发,它为用户提供了联系人姓名和号码编辑窗口,用户完成编辑并确认后, Contactedit调用ContactnotePr ovider的insert()或up2 data()方法将用户输入的值保存到电话簿数据库中去,然后返回Contactlist,这时Contactlist显示的是更新后内容。
3.3代码的运行
完成工程的创建和源代码的编辑后就开始运行程序。在Ecli p se平台中选择Run>Open Run D ial og 选项,打开运行对话框。然后,在对话框左边的type filter text下选择Andr oid App licati on>contactnote,再
2008年第8期公磊等:基于Andr oid 的移动终端应用程序开发与研究
点击对话框中的Run 按钮,应用程序就会被加载到
仿真器上并开始运行(如图2)
。图2 电话簿程序仿真运行
4 结束语
Andr oid 手机应用程序开发需要着眼于它的整个
体系构架,是一项复杂的工程。本文分析了Andr oid
体系的层次架构,并在此基础上介绍了Andr oid 应用程序开发的相关技术和基本的开发流程。Andr oid 平
台具有极大的开放性和兼容性,相信广大开发者可以借助Andr oid S DK 提供的强大技术支持,开发出丰富多彩、极具个性的移动应用。
参考文献:
[1] 3G 继续稳步快行[J ].中国电信业,2007(2):50251.[2] Code Home .Andr oid 2An Open Handset A lliance Pr oject
[E B /OL ].http://code .google .com /andr oid /what 2is 2an 2dr oid .ht m l,2008201201.
[3] 邸烁.Andr oid 揭秘和未来发展趋势[E B /OL ].http://
publish .it pub .net/zt/andr oid /index .ht m l,2008203217.[4] 百度空间.Google Andr oid 里头到底有什么?[E B /OL ].
http://hi .baidu .com /luj w c81/bl og/ite m /12777c0754bc b8c97b47c3.ht m l,2008201228.
[5] 叶达峰.Ecli p se 编程技术与实例[M ].北京:人民邮电
出版社,2006.
[6] 张超,王阿川,王智.基于J2ME 和J2EE 的手机软件的
研究[J ].黑龙江科技信息,2007(3):21,201.
[7] 扣锁.短信息在嵌入式L inux 系统中的设计与实现
[D ].东南大学硕士学位论文,2005.
[8] 刘向辉.基于Java 的移动终端中间件的研究与设计
[D ].华东师范大学硕士学位论文,2005.
[9] 高博.基于J2ME 的移动通信技术的研究与应用[D ].
沈阳工业大学硕士学位论文,2006.
(上接第84页)
Login Bean .cl oseSt m t ();//关闭St m t 对象Login Bean .cl oseConn ();//关闭Conn 对象
//使用sessi on 对象的put V alue ()方法,把用户名name1
赋给变量userna me
sessi on .put V alue ("userna me
//如果登录成功,使用javascri p t 语句直接进入index_ok .js p 文件中
window .l ocati on ="index_ok .js p?mark =成功登录"
//如果有错,则输出提示信息“用户名或者密码错误!”else {
rs .cl ose ();
Login Bean .cl oseSt m t ();Login Bean .cl oseConn ();%>
}
5 结束语
随着W eb 技术的发展,人们生活水平的提高,人们生活方式也发生了巨大的改变。网上购物的出现使人们可以足不出户,看遍世界,消费者可以用自我服务的方式来完成交易,而企业通过网站可以展示产品,与用户进行交流沟通,从而吸引顾客,扩大客户群。网上购物将对社会的生产和管理、人们的生活方式、法律制度和教育文化带来巨大的影响。
参考文献:
[1] 杨学瑜,王志军,刘同利.JSP 入门与提高[M ].北京:清
华大学出版社,2004.
[2] 刘荣华,张扬,聂颂,等.O racle 数据库管理与应用系统
开发[M ].北京:人民邮电出版社,2005.
[3] 鲁晓东,李育龙,杨健.JSP 软件工程案例精解[M ].北
京:电子工业出版社,2005.
[4] 豆腐.JSP,ASP +,ASP,PHP 运行速度测试报告[E B /
OL ].http://www .itlearner .com /A rticle /2006/3038.sht 2m l,2006205205.下载本文