平台天气预报widget的设计与实现.docx
《平台天气预报widget的设计与实现.docx》由会员分享,可在线阅读,更多相关《平台天气预报widget的设计与实现.docx(38页珍藏版)》请在冰豆网上搜索。
平台天气预报widget的设计与实现
Android平台天气预报widget的设计与实现
诚信声明
我声明,所呈交的毕业论文是本人在老师指导下进行的研究工作及取得的研究成果。
据我查证,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得其他教育机构的学位或证书而使用过的材料。
我承诺,论文中的所有内容均真实、可信。
毕业论文作者签名:
签名日期:
年月日
Android平台天气预报widget的设计与实现
摘要
本文对基于Android平台的widget开发技术进行了分析和研究。
先简要介绍了Android开发必备基础知识,再切入软件的具体实现过程。
软件的实现是利用网络接口和GoogleAPI获取网络xml文件,然后通过xml文件解析取得城市天气预报信息。
最终使用widget制作方法,利用RemoteViews等技术完成桌面部件。
关键词:
Android;桌面小部件;天气预报
thedesignandimplementationofweatherforecastingwidgetonAndroidplatform
ABSTRACT
ThispaperanalysesandresearchesthedevelopmenttechniqueontheAndroidplatform.ItfirstintroducethebasicknowledgethatisnecessaryforAndroiddevelopment.Andthenitintroducetheconcreteimplementationofthesoftware.
ThesoftwareusesnetworkinterfaceandGoogleAPItogetxmldocument.Thenitparsethedocumenttogettheweatherinformationofthecity.FinallyIusetechniquesuchasRemotViewstoimplementthewidget.
Keywords:
Android;widget;weatherforecast
第1章绪论
1.1项目背景
2009年1月7日,工业和信息化部为中国移动、中国电信和中国联通发放3张第三代移动通信牌照,此举标志着我国正式进入3G时代。
中国3G正式商用和规模建网,决定了中国基于Android的应用程序开发将会处于一个蓬勃发展时期
Android是Google于07年11月5日宣布的基于Linux平台开源手机操作系统名称,号称是首个为移动终端打造的真正开放和完整的移动软件。
它包括操作系统、用户界面和应用程序——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。
谷歌与开放手机联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和T-Mobile在内的30多家技术和无线应用的领军企业组成。
Android有如下多个优势:
1、开放性
2、强大的Google作为传媒平台
3、较为成熟的Linux系统
4、较强的可移植性和强大的操作性
1.2研究现状
widget作为桌面上网的新模式,Widget在2007年已形成较大市场规模,并为广告商及创业公司带来新的商机。
但是为社交网站开发Widget的软件开发人员却表示,Widget的影响力被严重低估。
Android中的Widget是Android1.5以后加入的一个特性,允许程序显示一些常用而又重要的信息在用户的Homescreen(桌面主屏)上。
简单的说就是有两个特点:
一是可以添加到Homescreen上,
二是按照一定的时间进行内容更新
以上两点就是由android系统中的AppWidgetFramework(框架)来支持完成的。
当最基本的控件,如Clock和PictureFrameHomeScreen,随第一款Android手机的发布后,Android用户就开始尝试编写各种应用Widget(小工具)了,随着WidgetAPI的公开,为开发人员带来了全新有趣的开发模式,除了传统的电话应用外,还可以做其它方面的应用开发。
1.3论文组织
本文主要在介绍Androidwidget应用程序开发的要点,以及本人这段时间学习Android开发的体会。
本文在第二章介绍Android开发环境的搭建,在第三章介绍Andoid开发基础知识,第四章介绍天气预报桌面小程序的设计与实现,最后一章介绍在软件设计过程中遇到的难题和相应解决方案。
第2章Android开发环境
2.1Android开发环境搭建流程
Android开发首先需要搭建完整的开发环境,由于软件均是基于DalvikJavaVirtualMachine运行的所以Google官方推荐使用主流的Java开发IDEEclipse。
我们需要下载必要的开发组件。
1)Java运行时库(JRE),由于Eclipse使用Java开发,所以需要它才可以正常运行IDE。
2)Eclipse集成开发环境,官方提供的Android开发插件ADTPlugin是基于Eclipse编写的,当然用户可以使用NetBean、JBuilder当作代码编辑器使用,但目前没有完整的调试集成。
3)EclipseADTPlugin插件是AndroidDevelopToolKit的插件,用户需要安装它才能在Eclipse中建立和调试Android程序。
4)AndroidSDK,它包含了完整的Android模拟器、Android开发文档和调试工具,Google官方也会定时更新
2.1.1安装EclipseADTPlugin插件
首先我们将下载的JRE安装。
运行Eclipse开发环境。
安装EclipseADTPlugin,选择【Help】>【SoftUpdates】>【FindandInstall…】
选择“AvailableSoftware”标签页,点击【AddSite…】按键。
添加update站点:
https:
//dl-
这时窗口中新增了“https:
//dl-
2.1.2安装AndroidSDK
将安装的AndroidSDK包解压,运行Eclipse。
选择【Window】>【Preferences】,选择Android,如下图
点Browse按钮选择SDK解压后的路径。
为了在DOS控制台中直接使用SDK的工具,可以将SDK的目录添加到Windows的path环境变量中:
在桌面上右击“我的电脑”,依次点击【属性】>【高级】>【环境变量】。
双击【系统变量】里面的Path项,将AndroidSDK中tools目录的完整路径添加到这里。
2.1.3更新AdroidSDK
AndroidSDK的升级如此之快让人有点招架不住,为了使用SDK的新特性,有必要将其升级
第一步:
打开Eclipse工具,在工具栏里找到
这个按钮,如果你没有找到也不要着急,你在菜单栏【Window】>【AndroidSDKandAVDManager】里也能找到这个按钮,点击之弹出如下对话框:
第二步:
选择AvailabePackage这一标签,然后将出现如下对话框(记得要勾选那个复选框):
然后选择InstalledPackages,点击UpdateALL按钮即可升级。
2.1.4配置Android模拟器
(1)首先打开"AndroidSDKandAVDManager",如图所示。
(2)点击左边的"VirtualDevices"选项,在点击右边的"New..."按钮,来新建一个AVD。
(3)在"name"标签处填写AVD的名字,"Target"标签处选择api等级,在"size"标签处填写要创建的SD卡的大小,在"skin"标签中设置模拟器的风格,
(4)到这里,还需要配置模拟器运行的AVD,操作步骤:
点击"Run",选择"OpenRunDialog"菜单命令,打开对话框,如图2-33所示。
(5)双击"Run"对话框左边的导航器中的"AndroidApplication"菜单命令,创建一个Android项目运行配置。
在右边的"Name"文本框中输入Android项目运行配置的名字,在"Android"选项卡中的"Project"文本框中输入要运行的Android项目,同样可以点击右边的"Browse..."按钮来选择Android项目。
2.2开发工具Eclipse介绍
Eclipse是一种可扩展的开放源代码IDE。
2001年11月,IBM公司捐出价值4,000万美元的源代码组建了Eclipse联盟,并由该联盟负责这种工具的后续开发。
集成开发环境(IDE)经常将其应用范围限定在“开发、构建和调试”的周期之中。
为了帮助集成开发环境(IDE)克服目前的局限性,业界厂商合作创建了Eclipse平台。
Eclipse允许在同一IDE中集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显著改变了项目工作流程,使开发者可以专注在实际的嵌入式目标上。
Eclipse框架的这种灵活性来源于其扩展点。
它们是在XML中定义的已知接口,并充当插件的耦合点。
扩展点的范围包括从用在常规表述过滤器中的简单字符串,到一个Java类的描述。
任何Eclipse插件定义的扩展点都能够被其它插件使用,反之,任何Eclipse插件也可以遵从其它插件定义的扩展点。
除了解由扩展点定义的接口外,插件不知道它们通过扩展点提供的服务将如何被使用。
利用Eclipse,我们可以将高级设计(也许是采用UML)与低级开发工具(如应用调试器等)结合在一起。
如果这些互相补充的独立工具采用Eclipse扩展点彼此连接,那么当我们用调试器逐一检查应用时,UML对话框可以突出显示我们正在关注的器件。
事实上,由于Eclipse并不了解开发语言,所以无论Java语言调试器、C/C++调试器还是汇编调试器
都是有效的,并可以在相同的框架内同时瞄准不同的进程或节点。
Eclipse的最大特点是它能接受由Java开发者自己编写的开放源代码插件,这类似于微软公司的VisualStudio和Sun微系统公司的NetBeans平台。
Eclipse为工具开发商提供了更好的灵活性,使他们能更好地控制自己的软件技术。
eclipse是一款非常受欢迎的java开发工具,使国内的用户越来越多,实际上使用它的java开发人员是最多的。
缺点就是较复杂,对初学者来说,理解起来比较困难。
第3章Android程序设计基础
3.1系统结构
Android作为一个移动设备开发平台,其软件层次结构包括了一个操作系统,中间件和应用程序。
其框架如下图所示
其软件层析结构自上而下可以分为以下几个层次:
1.应用程序(Application);
2.应用程序框架(ApplicationFramework);
3.各种库(Libraries)和Android运行环境(RuntTime);
4.操作系统层(OS)。
3.1.1应用程序
Android的应用程序通常涉及用户界面和用户交互,这类程序是用户实实在在感受到的。
Android的应用程序目前以Java语言编写。
Android本身提供桌面,联系人,电话和浏览器等核心应用。
同时应用程序开发者可以根据应用程序框架层的API实现自己的程序,这也是Android开源的巨大潜力体现。
Android这种开放而强大的平台给每一个程序开发者提供了公平的机会,每一个开发者都可以加入移动互联的世界,共同推动移动互联的发展。
3.1.2应用程序框架
普通的开发者可以使用Android核心应用程序的系统API。
Android的应用开发框架涉及的非常巧妙,通过这套应用框架,各种组件可以被用户的应用重复利用,各种服务也可以被各种应用重复应用。
开发人员应该很好地理解这套框架的工作机制,这样才能开发出更好的应用程序。
下面列举应用框架的主要部分:
1.一组Views。
这些UI组件包括列表、文本框、按钮等。
通过这些UI组件,可以构建应用程序的试图部分,这部分也就是用户能看到的部分。
2.ContentProviders。
主要是提供一种机制,通过这种机制,各个应用程序之间可以实现数据的互访和共享。
3.ResourceManager。
它负责管理非代码的访问。
如本地图片资源,设计布局的XML文件等的访问。
4.NotificationManager。
它能让程序的将自己的警示信息显示在状态栏上。
例如,当有短信的时候,可以在状态栏上显示新短信的信息。
5.ActivityManager。
它管理应用的生命周期,并且提供应用页面退出的机制。
在Android应用中,一个应用一般都是多个页面组成,而每个页面的单位就是Activity。
3.1.3库和运行环境
Android包括一些C/C++库,这些库能被Android系统的不同组件使用。
他们通过Android应用程序框架为开发者提供服务。
3.2Android应用程序组成
要进行应用开发,还需要对Android应用构造进行深入的分析。
Android应用程序由以下4个模块构造而成:
Activity
BroadcastIntentReceiver
Service
ContentProvider
当然,也不是每个Android应用程序都必须由这4部分组成,它可以根据开发者需求来进行组合。
在这里还需要介绍Intent的概念和使用方法,他在应用程序的运行中连接两个不同的组件,通过Intent你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来请求。
3.2.1Avtivity介绍
Activity是最基本的模块。
我们称之为"活动",在应用程序中,一个活动(Activity)通常就是一个单独的屏幕。
每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件作出响应。
大多数的应用都是由多个Activity显示组成,例如,对一个文本信息应用而言,第一个屏幕用来显示发送消息的联系人列表,第二个屏幕用来写文本消息和选择收件人,第三个屏幕查看消息历史或者消息设置操作等。
这里的每一个屏幕就是一个活动,很容易实现从一个屏幕到一个新的屏幕,并且完成新的活动。
当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史栈中。
用户可以返回到历史栈中的前一个屏幕,当屏幕不再使用时,还可以从历史栈中删除。
简单理解,Activity代表一个用户所能看到的屏幕,主要用于处理应用程序的整体性工作,例如,监听系统事件(按键事件、触摸屏事件等),为用户显示指定的View,启动其他Activity等。
所有应用的Activity都继承于android.app.Activity类,该类是Android提供的基层类,其他的Activity继承该父类后,通过父类的方法来实现各种功能,这种设计在其他领域也较为常见。
3.2.2BroadcastIntentReceiver介绍
可以使用BroadcastReceiver来让应用对一个外部的时间作出相应。
例如,当电话呼入这个外部时间到来的时候,可以利用BroadcastReceiver进行处理。
BroadcastReceiver不能生成UI,也就是说对用户是不透明的,用户是看不到的。
BroadcastReceiver通过NotificationManager来通知用户这些事情发生了。
BroadcastReceiver既可以在AndroiManifest.xml中注册,也可以在运行时的代码使用Context.registerReceiver()进行注册。
只要是注册了,当时间来临的时候,即使程序没有启动,系统也在需要的时候启动程序。
各种应用程序还可以通过Context.sendBroadcast()将他们自己的intentbroadcasts广播给其他应用程序。
3.2.3Service介绍
Service即"服务"的意思,既然是服务,那么Service将是一个生命周期长而且没有用户界面的程序。
比如一个正在从播放列表中播放歌曲的媒体播放器,在这个媒体播放器应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。
然而,音乐重放这个功能并没有对应的activity,因为使用者会认为在导航到其他屏幕时音乐应该还在播放。
在这个例子中,媒体播放器这个activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。
同时,系统也将保持这个service一直执行,直到这个service运行结束。
另外,我们还可以通过使用Context.bindService()方法连接到一个service上(如果这个service当前还没有处于启动状态,则将启动它)。
当连接到一个service之后,还可用service提供的接口与它进行通讯。
以媒体播放器为例,我们还可以执行暂停、重播等操作。
3.2.4ContentProvider介绍
Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据,以及一些其他类型的数据。
一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型,也就是说,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据暴露出去。
外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,即用数据库存储还是文件存储,还是通过网上获得,这一切都不重要,重要的是外界可以通过这一套标准而统一的接口和程序里面的数据打交道。
可以读取程序数据,也可以删除程序的数据,当然中间会涉及一些权限问题。
3.2.5Intent介绍
Intent是一种运行时绑定(runtimebinding)机制,它能在程序运行的过程中连接两个不同的组件。
通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来请求。
比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION请求给Android,Android会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器Activity来浏览网页。
Android的三个基本组件——Activity,Service和BroadcastReceiver,它们都是通过Intent机制激活的,而不同类型的组件有传递Intent的不同方式。
(1)要激活一个新的Activity,或者让一个现有的Activity执行新的操作,可以通过调用Context.startActivity()或者Activity.startActivityForResult()方法。
这两个方法需要传入的Intent参数也称为ActivityActionIntent(活动行为意图),根据Intent对象对目标Activity描述的不同,来启动与之相匹配的Activity或传递信息。
(2)要启动一个新的服务,或者向一个已有的服务传递新的指令,调用Context.startService()方法或调用Context.bindService()方法将调用此方法的上下文对象与Service绑定。
(3)通过Context.sendBroadcast()、Context.sendOrderBroadcast()和Context.send-StickBroadcast()这三个方法可以发送BroadcastIntent。
BroadcastIntent发送后,所有已注册的拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。
这种机制被广泛运用于设备或系统状态变化的通知,一个常见的例子是,当Android的电池电量过低时,系统会发送Action为BATTERY_LOW的广播,接着任何可匹配该Action的IntentFilter注册的BroadcastReceiver都会各自运行自定义的处理代码,比如关闭设备的WIFI和GPS以节省电池消耗。
Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity、Service或Broadcast-Receiver作为响应。
所以,不同类型的Intent消息不会出现重叠:
BroadcastIntent消息只会发送给BroadcastReceiver,而绝不可能发送给Activity或Service。
由startActivity()传递的消息也只可能发送给Activity,由startService()传递的Intent只可能发送给Service。
Intent对象抽象地描述了要执行的操作,其描述的基本内容可以分为组件名称、Action(动作)、Data(数据)、Category(类别)、Extra(附加信息)和Flag(标志位)6部分
Intent分为显式Intent和隐式Intent:
对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”。
对于没有明确指出目标组件名称的Intent,则称之为“隐式Intent”。
Android系统使用IntentFilter来寻找与隐式Intent相关的对象。
显式Intent直接用组件的名称定义目标组件,这种方式很直接。
但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。
比如在某应用程序内,一个Activity启动一个Service。
隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
3.3Android应用程序工程文件
典型的工程文件如下图所示:
与一般的Java项目一样,src文件夹是项目的所有包及源文件(.java),res文件夹中则包含了项目中的所有资源,比如:
程序图标(drawable)、布局文件(layout)、常量(values)等。
下面来介绍其他Java项目中没有的gen文件夹中的R.java文件和每个Android项目都必须有的AndroidManfest.xml文件。
R.java是在建立项目时自动生成的,这个文件是只读模式,不能更改,R.java文件是定义该项目所有资源的索引文件。
AndroidManfest.xml文件则包含了该项目中所使用的Activity、Service、Receiver。
相当于应用的配置文件,在应用中是一个相当重要的文件。
第4章天气预报widget的设计
4.1网络功能实现
Android可以使用以下两种网络接口
4.1.1标准Java接口
.*下面提供了访问HTTP