程序开发.docx
《程序开发.docx》由会员分享,可在线阅读,更多相关《程序开发.docx(24页珍藏版)》请在冰豆网上搜索。
程序开发
密级:
学士学位论文
THESISOFBACHELOR
(2007—2011年)
题目:
基于Android平台的3G气象软件
学院:
软件学院系计算机软件
专业:
计算机软件
学号:
姓名:
指导教师:
起讫日期:
2010年12月至2011年5月
南昌大学
学士学位论文原创性申明
本人郑重申明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究作出重要贡献的个人和集体,均已在文中以明确方式表明。
本人完全意识到本申明的法律后果由本人承担。
作者签名:
日期:
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权南昌大学可以将本论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
保密□,在年解密后适用本授权书。
本学位论文属于
不保密□。
(请在以上相应方框内打“√”)
作者签名:
日期:
导师签名:
日期:
Android平台3G手机气象软件
专业:
计算机软件学号:
学生姓名:
指导老师:
摘要
随着智能手机的快速普及,智能手机操作系统市场风生水起。
为了让智能手机用户能够随时随地查询互联网所提供的服务,一种高效的办法就是将应用系统的功能拓展到手机终端上,让手机能够通过移动网以及互联网访问Web网站并处理各种各样的业务。
因此,智能手机的应用软件及其需要的服务将有广阔的发展前景。
在如今这个智能手机系统群雄纷争的时候,2008年Google推出了一款名为Android的开源智能手机操作系统,它采用Linux内核,开放手机联盟(OHA)成员可以任意使用和修改SDK包,系统的开源性使其具有良好的拓展性。
这款软件包括了操作系统、用户界面和应用程序,即智能手机工作所需要的全部软件。
Android的最大特点是其开放性体系架构,不仅具有非常好的开发、调试环境,而且还支持各种可扩展的用户体验,包括丰富的图形组件、多媒体支持功能以及强大的浏览器。
因此,对于软件从业人员来说,Android平台具有无限的吸引力。
本文就在分析讨论Android手机软件开发技术原理的基础上,开发出能为用户提供更好的基于Android平台的3G手机气象软件。
关键字:
android;气象软件;智能手机平台
Abstract
Withtherapidproliferationofsmartphones,smartphoneoperatingsystemmarket,windandwater.InorderforsmartphoneuserstochecktheInternetanytime,anywhereservicesprovidedanefficientwaytoexpandthefunctionofthesystemwillbeappliedtothemobilephoneterminal,themobilephonetoInternetaccessviamobilenetworks,andvarietyofWebsitesandprocessbusiness.Therefore,thesmartphoneapplicationsandtheneedfortheservicewillhavebroadprospectsfordevelopment.
Intoday'ssmartphonesystemwhendisputeswarlords,2008,GoogleintroducedasmartphonecalledtheAndroidopensourceoperatingsystem,whichusesLinuxkernel,OpenHandsetAlliance(OHA)memberscanbefreetouseandmodifytheSDKpackage,thesystemIthasagoodopen-sourcenatureoftheexpansionof.Thesoftwareincludestheoperatingsystem,userinterfaceandapplicationsthatneedtoworksmartphonesallthesoftware.Android'sbiggestfeatureisitsopenarchitecture,notonlyhasaverygooddevelopmentanddebuggingenvironment,butalsosupportsavarietyofscalableuserexperience,includingrichgraphicalcomponents,multimediasupport,andpowerfulbrowser.Therefore,forsoftwareprofessionalsis,Androidplatformhasunlimitedappeal.
Inthispaper,theanalysisanddiscussionAndroidmobilephonesoftwaredevelopmenttechnologyonthebasisoftheprinciple,developedtoprovideuserswithbetterplatformtothe3GhandsetsbasedonAndroidmeteorologicalsoftware.
Keywords:
android;weathersoftware;smartphoneplatform
目录
摘要I
AbstractII
第一章绪论1
1.1研究内容1
1.2研究意义1
1.3研究现状和发展趋势1
第二章系统分析3
2.1研究目标3
2.2需求分析3
2.3性能分析3
第三章系统开发环境及相关技术4
3.1Android开发环境介绍4
3.2Android开发平台搭建4
第四章程序设计6
4.1用户界面设计6
4.2数据库设计6
4.3程序模块设计7
第五章程序开发9
5.1文件结构与用途9
5.2数据提供者10
5.3后台服务16
5.3.1获取天气数据16
5.3.2读取天气数据实例19
5.3.3定时更新时间。
19
5.4用户界面19
5.4.1程序入口类ForecastWidget19
5.4.2设置页面ConfigureActivity21
5.4.3详细页面DetailForecastActivity22
5.5动态特效23
第六章系统测试25
第七章总结29
参考文献30
致谢31
第五章程序开发
5.1文件结构与用途
在程序开发阶段,首先确定“Android平台3G手机气象软件”的工程名为ty-weather,据程序模块设计的内容,建立ty-weather工程。
Weather工程源代码的结构如图5.1所示。
图5.1ty-weather工程的源代码文件
为了使源代码文件的结构更加清晰,Weather工程设置了多个命名空间,分别用来保存用户界面、数据库、后台服务和工具实体的源代码文件,源代码文件的名称以及说明如表5.1所示。
表5.1ty-weather工程的文件用途说明
包名称
文件名
说明
com.ty.weather
ConfigureActivity.java
“设置页面”的Activity
com.ty.weather
DetailForecastActivity.java
“详细页面”的Activity
com.ty.weather
ForecastProvider.java
天气预报相关数据提供者,操作数据库
com.ty.weather
ForecastService.java
后台进程内服务
com.ty.weather
ForecastTimeService.java
后台时间服务
com.ty.weather
ForecastWidget.java
实现AppWidget组件,并启动服务
com.ty.weather
WebServiceHelper.java
网络数据获取模块
com.ty.weather.util
ForecastEntity.java
未来天气信息的类
com.ty.weather.util
ForecastUtil.java
天气信息工具类
com.ty.weather.util
WidgetEntity.java
当前天气信息的类
Android的资源文件保存在/res的子目录中。
其中、/res/anim目录中保存的是产生动画效果的XML文件,/res/drawable/目录中保存的是图像文件,/res/values目录中保存的是用来自定义字符串和颜色的文件,/res/xml目录中保存的是XML格式的数据文件。
所有在程序开发阶段可以被调用的资源都保存在这些目录中,具体每个资源文件的用途可以参考表5.2:
表5.2资源文件名称与用途
资源目录
文件
说明
anim
rotatecurrentweather.xml
渐变透明度动画效果
translatecloudleft.xml
画面转换位置移动动画效果(从左至右)
translatecloudright.xml
画面转换位置移动动画效果(从右至左)
translaterain01.xml
画面转换位置移动动画效果(从上至下)
translaterain02.xml
画面转换位置移动动画效果(从上至下)
translaterain03.xml
画面转换位置移动动画效果(从上至下)
translaterain04.xml
画面转换位置移动动画效果(从上至下)
translaterain05.xml
画面转换位置移动动画效果(从上至下)
drawable
cloudy.png
这个文件夹里是工程里所用的图片,如有表示天气状况、数字等,此处不赘述。
dots.png
number_7_tahoma.png
weather_sunny.png
layout
configure.xml
设置城市、天气更新频率的布局
weather.xml
“显示页面”的布局
detail.xml
“详细显示”页面上边的显示当前天气的布局
detailitems.xml
“详细显示”页面下边的显示未来天气的布局
values
color.xml
保存颜色的XML文件
strings.xml
保存字符串的XML的文件
xml
weatherwidget.xml
AppWidget的属性文件
5.2数据提供者
数据提供者ForecastProvider继承ContentProvider,是在应用程序间共享数据的一种接口机制。
应用程序在不同的进程中运行,因此,数据和文件在不同的应用程序之间是不能够直接进行访问的。
而CotentProvider为程序员提供了较高级的数据共享方法,应用程序可以指定需要共享的数据,而其他应用程序则可以在不知数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作。
在介绍ForecastProvider的核心代码前,首先了解一下WidgetEntity.java(当前天气信息的类)和ForecastEntity.java(未来天气信息的类)。
(1)WidgetEntity.java的部分代码:
publicclassWidgetEntity{
privateArrayListdetails=
newArrayList();//ForecastEntity对象
privateIntegerid;//编号
privateIntegerupdateMilis;//更新频率
privateStringcity;//城市
privateStringpostalCode;//城市标记
privateLongforecastDate;//预报时间
privateStringcondition;//天气情况
privateIntegertempF;//华氏温度
privateIntegertempC;//摄氏温度
privateStringhumidity;//湿度
privateStringicon;//天气图标
privateStringwindCondition;//风力风向
privateLonglastUpdateTime;//最后更新时间
privateIntegerisConfigured;//是否已设置
......
}
从代码中可以看出,除ForecastEntity的对象details,WidgetEntity类中有以上公有静态属性id、updateMilis、updateMilis、postalCode、forecastDate、condition、tempF、tempC、humidity、icon、windCondition、lastUpdateTime、isConfigured,完全对应数据库中weather_widget的表。
(2)ForecastEntity.java的部分代码:
publicclassForecastEntity{
privateIntegerid;//编号
privateStringdayOfWeek;//星期
privateIntegerlow;//最低温度
privateIntegerhight;//最高温度
privateStringicon;//天气图标
privateStringcondition;//天气情况
privateIntegerwidgetId;//组件id
从代码中可以看出,WidgetEntity类中有以上公有静态属性id、dayOfWeek、low、hight、icon、condition、widgetId,完全对应数据库中weather_forcast的表。
在创建ForecastProvider时,首先需要使用数据库、文件系统或网络实现底层存储功能,这里我们采用数据库建立了数据库设计中的两张表,从而实现了底层存储功能。
然后在继承ContentProvider的类中实现基本数据操作的接口函数,包括添加、删除、查找和更新等功能。
下面就核心代码进行分析。
(1)创建数据库:
DatabaseHelper类继承SQLiteOpenHelper,SQLiteOpenHelper这个类可以辅助建立、更新和打开数据库。
DatabaseHelper在建立数据库时,同时建立了两个数据库表weather_widget和weather_forcast,并对保存配置信息的表进行了初始化。
具体代码如下所示:
privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{
//数据库名称
privatestaticfinalStringDATABASE_NAME="forecasts.db";
//数据库版本
privatestaticfinalintDATABASE_VERSION=2;
//构造方法,重载父类构造
publicDatabaseHelper(Contextcontext){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
publicvoidonCreate(SQLiteDatabasedb){
//创建weather_widget表
publicvoidonCreate(SQLiteDatabasedb){
//创建weather_widget表
db.execSQL("CREATETABLE"+TABLE_WIDGET+"("
......);
//创建weather_forecast表
db.execSQL("CREATETABLE"+TABLE_FORECAST+"("
......);
}
}
//重写onUpgrade()方法
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
......
}
}
}
(2)URI设置:
ContentProvider可以提供多个数据集,调用者使用URI(通用资源标识符)对不同的数据集的数据进行操作。
URI用来地位任何远程或本地的可用资源。
ContentProvider使用的URI语法结构content:
////。
因此,我们就需要先来对URI进行设置。
代码如下:
publicstaticclassWeatherWidgetsimplementsBaseColumns{
//继承BaseColumns可以提供自动生成的ID
//声明CONTENT_URI
publicstaticfinalUriCONTENT_URI=Uri.parse("content:
//"
+AUTHORITY+"/widgets");
publicstaticfinalStringFORECAST_END="forecasts";
//指操作多条数据
publicstaticfinalStringCONTENT_TYPE="vnd.android.cursor.dir/awidget";
//指操作单条数据
publicstaticfinalStringCONTENT_ITEM_TYPE="vnd.android.cursor.item/widget";
}
(3)查询功能:
首先我们先了解一下SQLiteQueryBuilder的query()方法。
query(SQLiteDatabasedb,String[]projectionIn,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringsortOrder,Stringlimit),参数说明如表5.3:
参数
说明
SQLiteDatabasedb
要查询的数据库实例
String[]projectionIn
是一个字符串数组,里边的每一项代表了需要返回的列名
Stringselection
相当于SQL语句中的where部分
String[]selectionArgs
是一个字符串数组,里边的每一项依次替代在第三个参数中出现的问号(?
)
StringgroupBy
相当于SQL语句当中的groupby部分
Stringhaving
相当于SQL语句当中的having部分
StringsortOrder
描述是怎么进行排序
Stringlimit
相当于SQL当中的limit部分,控制返回的数据的个数
查询功能的核心代码如下:
publicCursorquery(Uriuri,String[]projection,Stringselection,
String[]selectionArgs,StringsortOrder){
//getReadableDatabase()这个函数会数据库是否存在、版本号和是否可读等情况,
//决定在返回数据库对象前,是否需要数据库。
返回一个可读的数据库对象。
SQLiteDatabasedb=dbHelper.getReadableDatabase();
//声明了一个SQLiteQueryBuilder对象,该对象利用传入的参数生成一个完整的
//sqlite查询语句,还可以完成查询工作并返回结果集(Cursor)。
SQLiteQueryBuilderqb=newSQLiteQueryBuilder();
Stringlimit=null;
//通过一个switch语句,完成了通过uri种类的辨别来生成不通的SQLiteQueryBuilder对象的工作。
switch(uriMatcher.match(uri)){
caseWIDGETS:
{
qb.setTables(TABLE_WIDGET);
break;
}
caseWIDGETS_ID:
{
StringappWidgetId=uri.getPathSegments().get
(1);
qb.setTables(TABLE_WIDGET);
qb.appendWhere(BaseColumns._ID+"="+appWidgetId);
break;
}
caseWIDGETS_FORECASTS:
{
//Pickalltheforecastsforgivenwidget,sortedbydateand
//importance
//获得appWidgetId
StringappWidgetId=uri.getPathSegments().get
(1);
//为该SQLiteQueryBuilder对象设置它查询工作将针对的表
qb.setTables(TABLE_FORECAST);
//qb的where条件
qb.appendWhere(ForecastEntity.WIDGET_ID+"="+appWidgetId);
//按照BaseColumns._ID进行排序
sortOrder=BaseColumns._ID+"ASC";
break;
}caseFORECASTS:
{
qb.setTables(TABLE_FOR