当前位置:范文大全 > 公文范文 > [安卓毕业论文x] androidapp快速开发

[安卓毕业论文x] androidapp快速开发

发布时间: 2021-10-27 16:43:40

学海无涯苦作舟!

学海无涯苦作舟!

学士学位论文

THESIS OF BACHELOR

题 目:基于 Android平台的3G气象软件

学 院:软件学院系计算机软件

专 业: 计算机软件

学 号:

姓 名:

摘要

随着智能手机的快速普及,智能手机操作系统市场风生水起。为了让智能手 机用户能够随时随地查询互联网所提供的服务, 一种高效的办法就是将应用系统

的功能拓展到手机终端上,让手机能够通过移动网以及互联网访问 Web网站并

处理各种各样的业务。因此,智能手机的应用软件及其需要的服务将有广阔的发 展前景。

在如今这个智能手机系统群雄纷争的时候,2008年Google推出了一款名为 An droid的开源智能手机操作系统,它采用 Linux内核,开放手机联盟(OHA)成 员可以任意使用和修改SDK包,系统的开源性使其具有良好的拓展性。这款软 件包括了操作系统、用户界面和应用程序,即智能手机工作所需要的全部软件。

 An droid的最大特点是其开放性体系架构,不仅具有非常好的开发、调试环境, 而且还支持各种可扩展的用户体验,包括丰富的图形组件、多媒体支持功能以及 强大的浏览器。因此,对于软件从业人员来说,An droid平台具有无限的吸引力。

本文就在分析讨论An droid手机软件开发技术原理的基础上,开发出能为用 户提供更好的基于An droid平台的3G手机气象软件。

关键字:an droid;气象软件;智能手机平台

Abstract

With the rapid proliferation of smart phones, smart phone operating system market, wind and water. I n order for smart phone users to check the Internet any time, any where services provided an efficie nt way to expa nd the function of the system will be applied to the mobile phone terminal, the mobile phone to Internet access via mobile n etworks, and variety of Web sites and process bus in ess. Therefore, the smart phone applications and the need for the service will have broad prospects for developme nt.

In today's smart phone system whe n disputes warlords, 2008, Google in troduced a smart pho ne called the An droid ope n source operati ng system, which uses Linux kern el, Ope n Han dset Allia nee (OHA) members can be free to use and modify the SDK package, the system It has a good ope n-source n ature of the expa nsion of. The software in cludes the operati ng system, user i nterface and applicatio ns that n eed to work smart pho nes all the software. An droid's biggest feature is its ope n architecture, not only has a very good developme nt and debugg ing en vir onment, but also supports a variety of scalable user experienee, including rich graphical components, multimedia support, and powerful browser. Therefore, for software professionals is, An droid platform has un limited appeal.

In this paper, the an alysis and discussi on An droid mobile pho ne software developme nt tech no logy on the basis of the prin ciple, developed to provide users with better platform to the 3G han dsets based on An droid meteorological software.

Keywords: an droid; weather software smartph one platform

目录

TOC \o "1-5" \h \z \o "Current Document" 摘要 11..

Abstract 山.

\o "Current Document" 第一章绪论 1..

1. 1研究内容 .1..

1. 2研究意义 .1..

1. 3研究现状和发展趋势 1.

\o "Current Document" 第二章 系统分析 .3.

2.1研究目标 3..

2.2需求分析 3..

2.3性能分析 3..

\o "Current Document" 第三章系统开发环境及相关技术 .4.

An droid 开发环境介绍 4.

An droid 开发平台搭建 4.

\o "Current Document" 第四章程序设计 .6..

4.1用户界面设计 6.

4.2数据库设计 6..

\o "Current Document" 程序模块设计 7..

\o "Current Document" 第五章程序开发 10

\o "Current Document" 文件结构与用途 10

\o "Current Document" 5.2数据提供者 11

5.3后台服务 17

获取天气数据 1.7

5.3.2读取天气数据实例 20

定时更新时间。

  20

5.4用户界面 20

程序入口类 ForecastWidget 20

设置页面 ConfigureActivity 22

详纟田页面 DetailForecastActivity 23

\o "Current Document" 5.5动态特效 24

\o "Current Document" 第六章系统测试 26

\o "Current Document" 第七章总结 30

参考文献 31.

致谢 32

第一章 绪论

1. 1研究内容

An droid平台3G手机气象软件是基于 An droid手机平台,运用Java语言, 从Google上获取天气预报信息,开发出针对使用 An droid平台的手机天气预报 系统。

1. 2研究意义

An droid平台3G手机气象软件的开发可以进一步扩大气象信息的覆盖面, 让

广大公众能够在第一时间方便且快捷地获取最新的气象预报(预警) 信息,以便

提前预防,把气象灾害造成的损失降到最低。

 同时也可以强化气象公共服务的职 能,完善公共服务体系、改善公共服务手段、增加公共服务产品、提高公共服务 质量,更好地发挥了气象事业对经济社会发展的现实性作用。

1. 3研究现状和发展趋势

据Gartner最新数据显示,2010年第二、三季度全球智能手机销售继续大 幅增长,其中第三季度安卓占全球智能手机市场的 25.5%,仅次于塞班,成为第

二大智能手机系统。2010第二、三季度与去年同期相比,增度分别是 15.4%及

22%增势迅猛。而塞班系统较09年的市场份额,尽管终端销量有大幅度提升, 但增势下滑10%形势非常严峻。其他操作系统的表现则要平稳很多。

2IW$Q3

MM 年 Ql

mi

mm

Symbian

2948.01

36.6%

1E3L48

44.6%

2050.00

25.5%

14145

J.5%

iOS

167%

111S

R1M

11M

85127

M7K 1

W灿

20

2.(%

325.99 j

7.9%

Linux

169.71 |

2.1?

19!』、

4.7%

OihtrOS

12L4S

1.5?

6L25

15%

Iotil

800

4109J3

100%

安卓是首款开源代码的操作系统,采用 Linux内核,开放手机联盟(OHA 成员可以任意使用和修改安卓的 SDK软件包。系统的开源性使其具有良好的拓展 性,一方面,为众多移动应用开发者提供了良好的系统性平台,有利于移动应用 的集合;另一方面,终端厂商可以针对自身的特殊需要“定制化开发”。与此相 比,尽管2010年2月,塞班基本完成开源工作,但由于代码臃肿,用户界面设 计缺失,塞班的开源并无实际意义,错失发展良机。

据In forma预测,2012年,安卓手机销量将超过诺基亚塞班手机,届时安 卓将成为全球最大的智能手机平台。谷歌表示目前安卓手机每日平均激活量为

20万部,销售速度加速上涨。

我们认为,安卓在全球市场的成长壮大,塞班市场份额不断下跌已成不争事

我们认为,安卓在全球市场的成长壮大,

塞班市场份额不断下跌已成不争事

实。安卓操作系统发展迅猛主要得益于免费、 开源和良好产业运作策略,这三点 为安卓在智能手机市场赢得更多的发展机遇。

 系统的免费让更多的厂商加入,推 动了份额的上升;代码的开源让更多的开发者进入应用开发; 应用的丰富吸引了 更多用户选择,这也是谷歌值得众多厂商学习的地方。

 此外,谷歌通过OHA联合 众多厂商进行系统研发,不断更新版本,将系统应用推广到更多的终端产品中, 确保用户体验持续改善。

第二章系统分析

2.1研究目标

了解An droid应用程序的设计和开发过程;

使用多种组件进行An droid平台3G手机气象软件的开发。

本软件是基于Eclipse的开发环境,依托Google气象数据建立气象信息数据 库,开发出了针对An droid平台的手机天气预报系统。

2.2需求分析

本软件是一个App Widget应用程序,启动程序后可以进行城市、更新频率的 设置,可以通过图片和文字显示当前和未来的天气状况,包括温度、湿度、风向 和雨雪情况等。这些天气数据是通过后台服务获取的,这个后台服务可以按照一 定时间间隔,从Google上获取天气预报信息,并将天气信息保存在数据库中。

从上面的描述中可以基本了解软件的功能需求:

启动App Widget应用程序;

设置界面:对要显示天气预报的城市及更新频率进行设置;

显示界面:通过文字和图片显示当前的天气情况,包括日期、时间、城市、

最高温度、最低温度、当前温度等。

详细界面:通过文字图片动画显示当前的天气情况,包括城市当前天气、温 度、风向、风速、湿度;同时显示今后四天的天气情况。

2.3性能分析

程序响应速度快、安全性高、信息处理速度快。

第三章系统开发环境及相关技术

An droid开发环境介绍

An droid的上层应用程序是用Java语言开发,同时还需要基于 Dalvik虚拟 机,所以,Google公司推荐使用主流的Java继承开发环境Eclipse。只有Eclipse 还不够,因为是使用Java语言进行开发,还应该有由SUN公司提供的Java SDK其 中包括JRE Java Run time En viro nment) 。此外,An droid的应用程序开发和

Java开发有较大区别的,所以还需要有 Google提供的An droid SDK。同时,还

需要在Eclipse安装ADT为An droid开发提供开发工具的升级或者变更,是 Eclipse下开发工具的升级下载的工具。

简言之,需要以下软件,才能搭建 An droid开发环境,从而进行An droid应

用程序的开发。

⑴ Java SDK

⑵ Eclipse

⑶ An droid SDK

(4) ADT

An droid 开发平台搭建

An droid开发平台搭建步骤:

首先至U /downloads/ 下载 Eclipse 集成开发环境

并且解压,这里推荐下载Java EE集成版本,可以为平台的搭建省下不少工作。

接着再去 /javase/downloads/index.jsp 站点下载 SDK后

安装,下载 /android/android-sdk-windows-1.5_r1.zip ,

An droid SDK1.5后解压。第一步下载工序就结束了。

双击Eclipse解压后目录中的eclipse.exe 然后启动,选择Eclipse菜单 中的 Help-> In stall New Software-〉 选项卡上的 Available Software ,点击

右侧的“ AdcT 输入 /android/eclipse/ 后确定,然

后在“ Work with ”下拉菜单中选择刚才输入的网址。过一会就会出现一个 Developer Tools选项,勾上以后点击Next以后Eclipse会自动网上查找 An droid 开发工具插件,然后找到 An droid DDMS和An droid Developme nt Tools ,选中 这两个点击Fi nish ,Eclipse就会自动下载并安装An droid插件了,最后会提示 重启 Eclipse。

重启后选择 Eclipse菜单中的 Win dows-> Prefere nces 在左侧的An droid 项目中SDK Locatio n中填入An droid SDK解压后的目录,然后点击 Apply。

在WindowsXP的系统变量中的path变量中添加一个值,该值指向解压后的

An droid SDK目录下的tools文件夹。

第四章程序设计

第四章程序设计

4.1用户界面设计

根据需求分析可以知道,应用程序应包含三个主要的用户界面,这里需要进 步分析每个用户界面中应该包括哪些显示内容。

在“设置页面”中,需要对要显示天气预报的城市及更新频率进行设置。在

“显示页面”中,显示当前的 天气状况,包括城市名称、温度、湿度、风向、 雨雪情况和获取数据时间等信息。在“详细页面”动态显示当前天气情况,还要 显示未来四天的天气情况。

根据对用户界面显示内容的分析,绘制出用户界面的草图,如图 4-1所示

设置页更i天吒图标

城市* nanchang当前温度:天汽图标城 市

设置页更

i天吒图标

城市* nanchang

当前温度:

天汽图标

城 市■ nanchang

当前温

度:

天弐團标周四天社情况妣

天气图标周五天气情况温度 天汽图标同丸天气情况温度 夭%图标周日夭气情况温度

图4-1用户界面草图

4.2数据库设计

本软件中有两部分数据需要存储,一个是显示页面的数据,另一个详细页

面的数据。因此选择SQLite数据库作为存储数据的方法,建立数据库 forcasts.db ,并且建立两张表 weather_forcast t 和 weather_widget,分别存储 显示页面的数据和详细页面的数据。

表4-1详细页面的数据库表 weather_forcast 的结构

属性

数据类型

说明

」d

in teger

自动增加的主键

widgetId

in teger

组件的ID号

dayOfWeek

text

周几

low

in teger

最低温度

hight

in teger

最高温度

ico n

text

显示天气的图标

con diti on

text

未来天气情况

表4-2显示页面的数据库表 weather_widget 的结构

属性

数据类型

说明

」d

in teger

存储 Widget组件id

city

text

进行天气信息查询的城市名

updateMilis

text

进行天气信息查询的频率,单位为分 /次

isC on figured

text

是否设置

postalCode

text

城市标记

forecastDate

in teger

预报日期

con diti on

text

当前天气情况

tempF

in teger

最高温度

tempC

in teger

最低温度

humidity

text

当前湿度

icon

text

天气图标

windCon diti on

text

风向风速情况

lastUpdateTime

in teger

最后一次更新时间

4.3程序模块设计

从功能需求上分析可以看出,整个应用程序应划分为 4个模块,分别是程

序启动、用户界面、后台服务和数据库适配器,各模块之间的关系如图4-2所示,

从模块结构图中不难看出,后台服务是整个应用程序的核心,主要是“数 据获取模块”,负责周期性的从 Google获取天气信息。后台服务在程序启动时 就由AppWidgetProvider启动,也可由用户界面通过 startService() 进行启动,

启动后的后台服务将一直保持运行状态。

用户界面从数据库中获取天气信息,而没有直接通过网络访问Google的天 气数据。之所以这么实际,一方面可以避免因网络通信不畅造成界面失去响应; 另一方面,后台服务可以及时更新数据,以保证数据的准确性。

数据库适配器封装了所有对SQLite数据库操作的方法,用户界面和后台服 务会调用它来实现数据库操作。

在完成用户界面设计、数据库设计和模块设计后,至此程序设计阶段基本 完成。

学海无涯苦作舟!

学海无涯苦作舟!

学海无涯苦作舟!

第五章 程序开发

5.1文件结构与用途

在程序开发阶段,首先确定“ An droid平台3G手机气象软件”的工程名为

ty-weather,据程序模块设计的内容,建立 ty-weather 工程。Weather工程源

代码的结构如图5.1所示

S ty-weather

src

19

+

+

+

+

+

3- 田

co

gen

ForecastVtil.

.ty. weather CcmfifureActivi ty. j aw DetdlFor^c^stActivi t y. j ava ForecastFrovi der jtva

F or ec as tServi ce. j ava

FwecastTim电Servi ce. java

Forecasttf i dget. java

WebServi ceHelper. java

.ty. weather, util

F or ec as tEmt 1.1y. j ava

j園園砂回圉園眩回dr

L WidgetEnti ty. [Generat^d Jaya

javft

j av4

Files]

Android L 5

a^seis

res

土 i

=i £5^ l<y4ut

i K j c onf i gur e. xml

[3C| detail- xml

| Jtj det &ili t ems. xml

園 w?4th?r. wml

— v al Ties

凶 coloar. xml

Ix'l strirkgi, kihI

semi

|Xj weatherwi d且电t- kuJL |Q] Art dr 口 i dWI azti £? s t. xml d?£aul^ 9 propert i ?s

图 5.1 ty-weather

为了使源代码文件的结构更加清晰,



工程的源代码文件

Weather工程设置了多个命名空间,分

别用来保存用户界面、数据库、后台服务和工具实体的源代码文件,源代码文件

的名称以及说明如表5.1所示。

表5.1 ty-weather 工程的文件用途说明

包名称

文件名

说明

com.ty.weather

Con figureActivity.java

"设置页面”的 Activity

com.ty.weather

DetailForecastActivity.ja

va

"详细页面”的 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

ForecastE ntity.java

未来天气信息的类

com.ty.weather.util

ForecastUtil.java

天气信息工具类

com.ty.weather.util

WidgetE ntity.java

当前天气信息的类

An droid的资源文件保存在/res的子目录中。其中、/res/a nim 目录中保存 的是产生动画效果的 XML文件,/res/drawable/目录中保存的是图像文件,

/res/values目录中保存的是用来自定义字符串和颜色的文件,/res/xml目录中 保存的是XML格式的数据文件。所有在程序开发阶段可以被调用的资源都保存在 这些目录中,具体每个资源文件的用途可以参考表 5.2 :

表5.2 资源文件名称与用途

资源目录

文件

说明

an im

rotatecurre ntweather.xml

渐变透明度动画效果

tran slatecloudleft.xml

画面转换位置移动动画效果(从左至右)

tran slatecloudright.xml

画面转换位置移动动画效果(从右至左)

tran slaterai n01.xml

画面转换位置移动动画效果(从上至下)

tran slaterai n0 2.xml

画面转换位置移动动画效果(从上至下)

tran slaterai n03.xml

画面转换位置移动动画效果(从上至下)

tran slatera inO 4.xml

画面转换位置移动动画效果(从上至下)

tran slaterai n05.xml

画面转换位置移动动画效果(从上至下)

drawable

cloudy.p ng

这个文件夹里是工程里所用的图片, 如有

表示天气状况、数字等,此处不赘述。

dots.p ng

n umber_7_tahoma.p ng

weather_su nny.png

layout

con figure.xml

设置城市、天气更新频率的布局

weather.xml

“显示页面”的布局

detail.xml

“详细显示”页面上边的显示当前天气的 布局

detailitems.xml

“详细显示”页面下边的显示未来天气的 布局

values

color.xml

保存颜色的XML文件

stri ngs.xml

保存字符串的XML的文件

xml

weatherwidget.xml

AppWidget的属性文件

5.2数据提供者

数据提供者Forecastprovider 继承ContentProvider,是在应用程序间共享

数据的一种接口机制。应用程序在不同的进程中运行,因此,数据和文件在不同 的应用程序之间是不能够直接进行访问的。而 Cote ntProvider为程序员提供了

较高级的数据共享方法,应用程序可以指定需要共享的数据,而其他应用程序则 可以在不知数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新 等操作。

在介绍 ForecastProvider 的核心代码前,首先了 解一下 WidgetEntity.java( 当前天气信息的类)和ForecastEntity.java (未来天气信

息的类)。

WidgetE ntity.java 的部分代码:

public class WidgetE ntity {

private ArrayListvForecastE ntity> details =

new ArrayListvForecastE ntity>(); //ForecastE ntity 对象

private

In teger

id ; // 编号

private

In teger

updateMilis

;//更新频率

private

Stri ng

city ; // 城市

private

Stri ng

postalCode ;

//城市标记

private

Lo ng

forecastDate ;

//预报时间

private

Stri ng

con diti on ;

//天气情况

private

In teger

tempF ; //

华氏温度

private

In teger

tempC ; //

摄氏温度

private

Stri ng

humidity ;

//湿度

private

Stri ng

icon ; //天气图标

private

Stri ng

windCon diti on

;//风力风向

private

Lo ng

lastUpdateTime

;//最后更新时间

private

In teger

isC on figured

;//是否已设置

}

的对象detailsWidgetE ntity 类中有以上公有静态属性id 、 updateMilis、updateMilis、postalCodeforecastDate

的对象details

WidgetE ntity 类

中有以上公有静态属性

id 、 updateMilis

、updateMilis

、postalCode

forecastDate

、condition

tempF、tempC、

humidity 、icon

、windCondition

,完全对应数据库中

,完全对应数据库中 weather_widget的表。

public class

lastUpdateTime 、isC on figured

ForecastE ntity.java 的部分代码:

private

In teger

id ; //

编号

private

Stri ng

dayOfWeek

;//星期

private

In teger

low ; //

最低温度

private

In teger

hight ;

//最高温度

private

Stri ng

icon ; //

天气图标

private

Stri ng

con diti on

;//天气

ForecastE ntity {

private Integer widgetld ; // 组件 id

从代码中可以看出,WidgetEntity 类中有以上公有静态属性id、 dayOfWeek、low、hight、icon、condition 、widgetld ,完全对应数据 库中 weather_forcast 的表。

在创建Forecastprovider时,首先需要使用数据库、文件系统或网络实现

底层存储功能,这里我们采用数据库建立了数据库设计中的两张表, 从而实现了

底层存储功能。然后在继承ContentProvider的类中实现基本数据操作的接口函 数,包括添加、删除、查找和更新等功能。下面就核心代码进行分析。

⑴ 创建数据库:DatabaseHelper 类继承 SQLiteOpenHelper ,

SQLiteOpe nHelper 这个类可以辅助建立、更新和打开数据库。

DatabaseHelper 在建立数据库时,同时建立了两个数据库表 weather_widget 和weather_forcast ,并对保存配置信息的表进行了初始化。具体代码如下所示:

private static class

DatabaseHelper

exte nds SQLiteOpe nH elper {

//数据库名称

private static

final

Stri ng

DATABASE_NAME = "forecasts.db"

//数据库版本

private static

final

int

DATABASE_VERSION = 2;

//构造方法,重载父类构造

public DatabaseHelper(C on text con text) {

super (context, DATABASE_NAME, null , DATABASE_VERSION );

}

public void on Create(SQLiteDatabase db) {

TOC \o "1-5" \h \z // 仓U建 weather_widget 表

public void on Create(SQLiteDatabase db) {

// 仓U建 weather_widget 表

db.execSQL( "CREATE TABLE " + TABLE_WIDGET + "("

……);

// 仓U建 weather_forecast 表

db.execSQL( "CREATE TABLE " + TABLE_FORECAST + "("

……);

}

}

// 重写 on Upgrade ()方法

@Override

public void onU pgrade(SQLiteDatabase db, int oldVersi on, int

n ewVersi on) {

⑵ URI设置:ContentProvider 可以提供多个数据集,调用者使用URI (通

用资源标识符)对不同的数据集的数据进行操作。URI用来地位任何远程或本地 的可用资源。ContentProvider 使用的 URI 语法结构

conten t://<authority>/<data_path>/vid> 。因此,我们就需要先来对

URI进行设置。代码如下:

public static class WeatherWidgets impleme nts BaseColu mns {

//继承BaseColumns 可以提供自动生成的ID

// 声明 CONTENT_URI

public static final Uri CONTENT_URI = Uri. parse ("content:〃"

+ AUTHORITY + "/widgets" );

public static final Stri ng FORECAST_END = "forecasts" ;

//指操作多条数据

public static final Stri ng CONTENT_TYPE =

"vn d.a ndroid.cursor.dir/awidget" ;

//指操作单条数据

public static final Stri ng CONTENT_ITEM_TYPE =

"vn d.a ndroid.cursor.item/widget" ;

}

⑶查询功能:首先我们先了解一下 SQLiteQueryBuilder 的query() 方法。

 query ( SQLiteDatabase db, String[] projectionln, String

selecti on. Strin g[] selecti on Args, String groupBy, String

having, String sortOrder, String limit ),参数说明如表 5.3:

参数

说明

SQLiteDatabase db

要查询的数据库实例

Strin g[] project ionln

是一个字符串数组,里边的每一项代表了需要返回的列名

String select ion

相当于SQL语句中的where部分

Strin g[] select ion Args

是一个字符串数组,里边的每一项依次替代在第三个参数 中出现的问号(?)

String groupBy

相当于SQL语句当中的groupby部分

String havi ng

相当于SQL语句当中的having部分

String sortOrder

描述是怎么进行排序

Stri ng limit

相当于SQL当中的limit部分,控制返回的数据的个数

查询功能的核心代码如下:

public Cursor query(Uri uri, Str in g[] projecti on, String selecti on,

Strin g[] selecti on Args, Str ing sortOrder) {

〃getReadableDatabase() 这个函数会数据库是否存在、版本号和是否可读等情

况,

//决定在返回数据库对象前,是否需要数据库。返回一个可读的数据库对象。

SQLiteDatabase db = dbHelper .getReadableDatabase();

//声明了一个SQLiteQueryBuilder 对象,该对象利用传入的参数生成一个完整的

//sqlite 查询语句,还可以完成查询工作并返回结果集( Cursor )。

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

String limit =

//通过一个switch 语句,完成了通过uri种类的辨别来生成不通的

SQLiteQueryBuilder 对象的工作。

switch ( uriMatcher .match(uri)) { case WIDGETS: {

TABLE_WIDGET );

null

qb.setTables( break

case WIDGETS_ID : {

Stri ng appWidgetId = uri.getPathSegme nts().get(1); qb.setTables( TABLE_WIDGET );

qb.appe ndWhere(BaseColu mns. _

break ;

case WIDGETS_FORECASTS : {

// Pick all the forecasts

ID +

+ appWidgetId);

for give n

widget, sorted by date

and

// importa nee

// 获得 appWidgetId

Stri ng appWidgetId = uri.getPathSegme nts().get(1); // 为该 SQLiteQueryBuilder

qb.setTables( TABLE FORECAST

//qb 的where条件

qb.appe ndWhere(ForecastE ntity.

// 按照 BaseColumns. ID

对象设置它查询工作将针对的表

);

WIDGET_ID + "=" + appWidgetId);

进行排序

sortOrder = BaseColu mns.

break

ID

+ " ASC"

case FORECASTS: {

TABLE FORECAST

qb.setTables( break ;

}

);

case FORECASTS_ID : {

Stri ng forecastId = uri.getPathSegme nts().get(1); qb.setTables( TABLE_FORECAST );

qb.appe ndWhere(BaseColu mn s. 」D + "="

break ;

+ forecastId);

}

}

r etur n qb.query(db, projecti on, selecti on, selecti on Args,

null

n ull ,sortOrder, limit);

}

添加、删除、更新功能由于核心代码类似,此处不一一赘述。

添加功能:

public Uri i nsert(Uri uri, Conten tValues values) {}

删除功能:

public int delete(Uri uri, String selecti on, Stri ng[] selecti on Args) {}

更新功能:

public int update(Uri uri, Conten tValues values, String selecti on,

Strin g[] selectio nArgs) {}

类型匹配:增删改查通过 switch判断,进行不同的操作,因而还需要对关

键字进行类型匹配。核心代码如下:

/*getType ()函数用来返回指定 URI的MIME数据类型

CONTENT_TYPE 表示URI是多条数据

CONTENT_ITEM_TYPE 表示是单条数据

*/

@Override

public Stri ng getType(Uri uri) {

// TODO Auto-ge nerated method stub switch ( uriMatcher .match(uri)) { case WIDGETS:

return WeatherWidgets.case WIDGETS_ID

return WeatherWidgets.

case WIDGETS_ID :

return WeatherWidgets.

case WIDGETS_FORECASTS :

return WeatherDetails.

case FORECASTS:

return WeatherDetails.

case FORECASTS_ID :

return WeatherDetails.

}

throw new IllegalStateExcepti on();

}

//构造无匹配方式的 uriMatcher

private static final UriMatcher

UriMatcher. NO_MATCH);

CONTENT_TYPE ;

CONTENT_ITEM_TYPE ;

CONTENT_TYPE ;

CONTENT_TYPE ;

CONTENT_ITEM_TYPE ;

uriMatcher = new UriMatcher(

private

static

final

int

WIDGETS = 101;

private

static

final

int

WIDGETS_ID = 102;

private

static

final

int

WIDGETS_FORECASTS = 103;

private

static

final

int

FORECASTS = 201;

private

static

final

int

FORECASTS_ID = 202;

//声明了 uriMatcher 的匹配方式和返回代码

static {uriMatcher .addURI(uriMatcher .addURI(uriMatcher .addURI(WIDGETS_FORECASTS );uriMatcher .addURI(

static {

uriMatcher .addURI(

uriMatcher .addURI(

uriMatcher .addURI(

WIDGETS_FORECASTS );

uriMatcher .addURI(

uriMatcher .addURI(

}

}

AUTHORITY , "widgets" , WIDGETS);

AUTHORITY , "widgets/#" , WIDGETS_ID );

AUTHORITY , "widgets/#/forecasts" ,

AUTHORITY , "forecasts"

AUTHORITY , "forecasts/#"

FORECASTS);

FORECASTS_ID );

5.3后台服务

后台服务是ty-weather工程的核心模块,在用户启动后持续在后台运行,直 到用户停止服务。后台服务主要有三个功能,一是周期性的获取Google的天气数 据并存储到SQLite,二是从SQLite读取出要显示的数据,三是定时更新“显示页 面”的时间。

5.3.1获取天气数据

天气数据的获取天气数据分为以下三个步骤:

(1) 从Google提供的Web Service 中获取的天气数据,数据的获取地址是:

/ig/api?weather=%s&hl=zh-cn 。核心代码女口

下:

public static WidgetE ntity queryWebservice(Stri ng postalCode)

throws ForecastParseExceptio n {

//编码出错

if (postalCode == n ull ) {

throw new ForecastParseException( "can not covert to entity" );

} Reader resp on seReader;

WidgetE ntity widgetE ntity = n ull ;

//通过HttpClient 创建Http 连接

HttpClie nt clie nt = new DefaultHttpClie nt();

//创建Http Get 请求

HttpGet request = new HttpGet(String. format ( WEBSERVICE_URL ,

postalCode));

try {

Log. d ( TAG, "get google's weather infomation" );

//发岀请求

HttpResp onse resp onse = clie nt.execute(request);

StatusL ine status = respon se.getStatusL in e();

Log. d ( TAG, "Request returned status " + status);

//取岀回复信息

HttpE ntity en tity = resp on se.getE ntity();

resp on seReader = new In putStreamReader(e ntity.getC onten t(),

"GB2312");

} catch (IOExcepti on e) {

throw new ForecastParseExcepti on( "Problem calli ng forecast

API" , e);

}

if (resp on seReader != n ull ) {

widgetE ntity = parseResp onse (resp on seReader);

}

return widgetE ntity;

对从网络上获取的字节流数据进行对象中。核心代码如下:⑵调用轻量级XML解析器XmlPullParser

对从网络上获取的字节流数据进行

对象中。核心代码如下:

解析,并且将解析结果保存在WidgetEntity

//返回类型为 WidgetEntity

private static WidgetE ntity parseResp on se(Reader resp on seReader)

throws ForecastParseExceptio n {

try {

// 使用工厂类 XmlPullParserFactory 来创建解析器 XmlPullParser

XmlPullParserFactory factory =

XmlPullParserFactory. newln sta nee ();

XmlPullParser xpp = factory. newPullParser();

Stri ng tagName = n ull ;

xpp.set In put(resp on seReader);

int eve ntType = xpp.getEve ntType();

while (eve ntType != XmlPullParser. END_DOCUMENT) {

if (eventType == XmlPullParser. START_TAG ) {

tagName = xpp.getName();

//根据不同的标签做不同的解析

if ( PROBLEM_CAUSE.equals(tagName)) {

throw new ForecastParseExcepti on(

"the city is non correct!" );

} else if ( FORECAST_INFORMATION .equals(tagName)) {

dealWithI nfomatio n (tagName, widgetE ntity, xpp);

} else if ( CURRENT_CONDITIONS .equals(tagName)) {

xpp);

xpp);

dealWithCurre ntCo nditio ns(tagName, widgetE ntity,

dealWithCurre ntCo nditio ns

(tagName, widgetE ntity,

} else if ( FORECAST_CONDITIONS .equals(tagName)) { dealWithForecastC on diti ons (tagName, widgetE ntity,

xpp);

}

}

eve ntType = xpp .n ext();

}

} catch (IOExcepti on e) { }

return widgetE ntity;

}

⑶ 将解析好的数据存储到SQLite数据库中。其过程是:使用

Conten tResolver对象,通过URI间接调用ContentProvider,使用Conten tResolver对象与 ContentProvider

Conten tResolver

对象,通过URI间接调用ContentProvider,

使用

Conten tResolver

对象与 ContentProvider

进行交互,而

Conten tResolver

则通过URI确定需要访问的ContentProvider

的数据集

核心代码如下,调用关系如图5.1所示

Conten tResolver

URI

lb

r

Conten tProvide

A

J

文件系统 数据库 网络

图 5.1 Co nte ntProvider

图 5.1 Co nte ntProvider 调用关系

Conten tResolver resolver = con text.getC onten tResolver();

resolver.delete(forecastUri, n ull , n ull );

Conten tValues values = new Conten tValues();

for (ForecastEntity forecast : wid

相关热词搜索: 安监 毕业论文 安卓毕业论文x

版权所有:杨帆范文网 2010-2024 未经授权禁止复制或建立镜像[杨帆范文网]所有资源完全免费共享

Powered by 杨帆范文网 © All Rights Reserved.。鲁ICP备16030136号