1、河北农业大学现代科技学院 本科毕业论文(设计)题 目:基于Android的天气预报查询系统的实现基于Android的天气预报查询系统的实现摘要:随着智能手机一步步走进人们的生活,它将成为人们获取信息的主要设备,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。Android作为当前最流行的操作平台,自然也存在着大量的应用服务需求。Android是基于Linux平台完全开源的手机操作系统,同时开发语言为Java,因此我选择了以Android为平台的手机天气预报系
2、统来作为我的毕业设计,目的是帮助用户随时随地查询天气信息及天气变化情况,让生活更加舒适方便。本文详细讲述了Android平台下天气软件的界面设计及界面的实现、控件的使用、界面的布局等内容,结合中国气象网的天气数据,将准确的天气情况以友好的方式呈现给用户,使用户可以更加赏心悦目地体验本软件的服务。关键词:Android 天气软件 手机天气预报软件系统System implementation of weather query based on AndroidAbstractWith the development of intelligent mobile phone step by step
3、into peoples lives, it will become the main device to obtain information, related to more widely, and plays a more and more important role in peoples daily life. Therefore, the development of critical applications has become an important factor affecting the popularization of mobile intelligent term
4、inal, application design and development of practical, convenient has important significance and good market prospects. Android as the most popular operating platform, natural also exist in application service needs of a large number of.Android is a mobile phone operating system Linux platform based
5、 on open source, at the same time, the development of language Java, so I chose the platform of mobile phone weather system with Android as my graduation design, the purpose is to help the user whenever and wherever possible query weather information and weather condition, make life more comfortable
6、 and convenient. This paper describes the layout of content, interface design and interface control weather software under the Android platform use, interface, combined with the weather data of China Meteorological Network, will be accurate weather conditions in a friendly way is presented to the us
7、er, the user can be more pleasant experience of the software service.Keyword: Android weather software the software system of mobile phone weatherII目录第一章 绪论.1 1.1 研究内容. .1 1.2 课题背景和意义.1 1.3 发展现状及趋势.1第二章 系统分析.2 2.1需求分析 2 2.2 Android系统的特点.22.3系统规划.32.4系统构架图.4第三章 Android开发环境及相关技术.4 3.1 Android开发环境介绍.4
8、3.2 Android开发平台搭建5 3.3相关技术介绍.5第四章 程序设计.10 4.1 界面设计10 4.2 项目框架134.3 主要功能实现.14 4.31 获取城市码db_weather.db 数据库文件.144.32 实现可伸缩性列表的构建与过滤.184.33 GPS定位功能的实现.214.34 Widget窗体小部件的更新.25第五章 功能测试.27第六章 结论31致谢.31参考文献.32第一章 绪论1.1研究内容 Android平台手机气象软件是基于Android手机平台,运用Java语言,从Google上获取天气预报信息,开发出针对使用Android平台的手机天气预报系统。本文
9、详细介绍了加载界面、实时天气界面、未来天气界面和搜索界面进行界面设计及实现,目的是使用户能够更加赏心悦目地体验此软件带来的服务。通过对界面的布局及控件的应用等相关内容的学习,使我们对Android平台下界面开发工作有一个初步的了解,并且经过这次开发过程,能够基本掌握这些内容。软件开发后能够帮助用户随时随地搜索由中国气象局提供的全国2564个县级以上城市的天气信息,并且把数据显示在一个界面美观、布局合理窗口内,使用户能够舒适的享受软件带来的服务。1.2课题背景和意义 近几年来随着智能手机的不断普及,应用的需求与日俱增,应用的开发成为当下最热门的技术之一。Android是一个真正意义上的开源智能手
10、机操作系统,该系统一经推出立即受到全球移动设备厂商和开发者的热捧。为顺应潮流,本设计旨在搭载Android的移动设备上运行,实现天气状况的实时更新与显示,方便人们的出行与生活。Android平台手机气象软件的开发可以进一步扩大气象信息的覆盖面,让广大公众能够在第一时间方便且快捷地获取最新的气象预报(预警)信息,以便提前预防,把气象灾害造成的损失降到最低。同时也可以强化气象公共服务的职能,完善公共服务体系、改善公共服务手段、增加公共服务产品、提高公共服务质量,更好地发挥了气象事业对经济社会发展的现实性作用。1.3发展现状及趋势Android系统自推出以来,就以明显的优势逐渐扩大自大的市场份额。据
11、美国某市场调研机构2012年发布的一份最新报告显示。2012年一季度在美国,基于Android系统的智能手机的销售量已占据全美手机销售量的28%份额,而大名顶顶的IPhone手机其市场份额紧追其后,占到21%的市场份额,已经确定了Android系统的市场占有比。据业内人士分析,随着Android系统相应软件的不断开发应用,选择Android系统手机或者无线终端设备的人会越来越多,其市场霸主的地位在更新更好的系统出现之前是不可动摇地。Google官方数据显示,Android电子市场(Android Market)上的应用程序数量已经突破45万个,一年内增加30万个。相信在不久的将来会有更多的用户
12、选择Android系统的手机。Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。第二章 系统分析 2.1 需求分析本软件是一个App Widget应用程序,启动程序后可以进行城市、更新频率的设置,可以通过图片和文字显示当前和未来的天气状况,包括温度、湿度、风向和雨雪情况等。这些天气数据是通过后台服务获取的,这个后台服务可以按照一定时间间隔,从Google上
13、获取天气预报信息,并将天气信息保存在数据库中。从上面的描述中可以基本了解软件的功能需求:(1) 启动App Widget应用程序;(2) 设置界面:对要显示天气预报的城市及更新频率进行设置;(3) 显示界面:通过文字和图片显示当前的天气情况,包括日期、时间、城市、最高温度、最低温度、当前温度等。(4) 详细界面:通过文字图片动画显示当前的天气情况,包括城市当前天气、温度、风向、风速;同时显示今后三天的天气情况。2.2 Android系统的特点1、开放性。Google与开放性手机联盟合作开发了android,Google通过与动行商,通过与运营商,设备制造商,开发商和其他有关各方结成深层次的合作
14、伙伴关系,希望借助建立标准化,开放式的移动电话软件平台,在移动产业内形成一个开放式生态系统。2、应用程序无界限。Android上的应用可以通过标准API访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可提供其它应用程序使用。3、应用程序是在平等的条件下创建的,移动设备上的应用程序可以被替换或扩展,即使是拨号或主屏幕这样的核心组件。4、应用程序可以轻松地嵌入网络。应用程序可以轻松地嵌入HTML,javascript和样式表,还可以通过Webview显示内容。5、应用程序可以并行运行。Android是一种完整的多任务环境,应用程序可以在其中并行运行,在后台运行时,应用程序可以生成通知引
15、起注意。2.3 系统规划由上述的需求,现将系统分为三大模块:天气显示界面模块、预报城市设置模块与Widget桌面小部件模块。各系统模块功能如下:1). 天气显示界面模块显示指定城市三天内的天气状况,包括日期、城市名称、温度、风力与当日的建议,用户可通过按菜单键来显示菜单更新当前天气与设置天气显示的界面背景,以及跳转至设置预报城市界面来更换预报城市。2). 预报城市设置模块由自动设置预报城市与手动设置二部分组成,自动设置实现GPS定位功能,自动确定当前用户所在地;而手动设置则通过可伸展性下拉列表单击选择系统数据库中预存的城市来进行设置,同时为了方便用户查找,支持以输入框的形式来过滤查询预报城市。
16、当单击选中城市时跳转至天气显示界面,来显示该城市当三天内的天气状况;第一次运行时自动跳到该界面。3).Widget桌面小部件模块为了方便用户实时了解天气状况,特别添加在Android系统桌面上显示当前天气与时间的天气小部件,使用户拿起手机的第一时刻就能了解天气,同时当用户单击小部件时,自动跳转至天气显示界面,显示三天内的详细天气。2.4 系统构架图 图2-4系统构架图第三章Android开发环境及相关技术3.1 Android开发环境介绍Android平台使用Java编程语言来开发应用程序,而Android提供了对Java的核心支持。考虑到Java虚拟机的执行效率和占用资源情况,Google重
17、新设计了Java的编译器,命名为Dalvik。Dalvik是经过优化的Java编译器,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。项目的开发在Eclipse环境中进行,由于进行的是Android应用程序的开发,需要在Eclipse安装ADT插件,即Android开发工具,这样Eclipse就可以和Android SDK建立连接,在Eclipse中启动Android模拟器、调试程序等工作。简言之,需要以下软件,才能搭建Android开发环境,从而进行Android应用程序的开发。Ja
18、va SDKEclipseAndroid SDKADT3.2 Android开发平台搭建Android开发平台搭建步骤:首先到http:/www.eclipse.org/downloads/下载Eclipse集成开发环境并且解压,这里推荐下载Java EE 集成版本,可以为平台的搭建省下不少工作。接着再去 站点下载后安装下载 SDK1.5后解压。第一步下载工序就结束了。双击Eclipse解压后目录中的eclipse.exe然后启动,选择Eclipse菜单中的Help- Install New Software- 选项卡上的Available Software,点击右侧的“Add”输入http:
19、/dl- with”下拉菜单中选择刚才输入的网址。过一会就会出现一个Developer Tools选项,勾上以后点击Next以后Eclipse会自动网上查找Android 开发工具插件,然后找到Android DDMS和Android Development Tools,选中这两个点击Finish,Eclipse就会自动下载并安装Android插件了,最后会提示重启Eclipse。重启后选择Eclipse菜单中的Windows- Preferences 在左侧的Android项目中SDK Location中填入Android SDK解压后的目录,然后点击Apply。在WindowsXP的系统变
20、量中的path变量中添加一个值,该值指向解压后的Android SDK目录下的tools文件夹。3.3相关技术介绍3.3.1 Activity在Android应用程序中,一个活动Activity通常就是一个单独的界面。每一个界面都被实现为一个独立的类,并且从Activity基类中继承而来,Activity将会显示由空间组成的用户接口,并对事件做出响应。大多数的应用都是由多个Activity显示组成,例如,第一个界面用来显示加载界面,第二界面用来显示实时天气界面,第三个界面用来显示未来一周的天气界面。这里的每一个界面就是一个Activity,很容易是从一个界面到一个新的界面,并且完成新的Acti
21、vity。当一个新的界面打开后,前一个界面将会暂停,并保留在历史栈中。用户可以返回到历史栈中的前一个界面,当界面不再使用时,从历史栈中删除。简单理解,Activity代表一个用户所能看到的界面,主要用于处理应用程序的整体性工作,例如,监听系统事件(按键事件、触摸屏事件等),为用户显示指定的View,启动其他Activity等。所有应用的Activity都继承于android.app.Activity类,该类是Android提供的基层类,其他的Activity继承该父类后,通过父类的方法实现各种功能,这种设计在其他领域也较为常见。3.3.2 IntentAndroid基本的设计理念是鼓励减少组件
22、间的耦合,因此Android提供了Intent(意图),Intent提供了一种通用的消息系统,它允许在你的应用程序与其他的应用程序间传递Intent来执行动作和产生时间。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。Intent可以划分为显示意图和隐式意图。显示意图调用Intent。SetClass方法明确制定了组件名的Intent为显示意图,显示意图明确制定了Intent应该传递给那个组件,在同一个应用内部使用的。隐式意图没有明确指定组件名的Intent为隐式意图。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据
23、(URI和数据类型)找到最合适的组件来处理这个意图。Intent负责对应用中一次操作的动作、动作涉及数据和附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的结构。3.3.3 Service如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行。Service跟 Activity一样也由Intent调用。由于Service在后台运行,所以没有界面,用来
24、处理耗时比较长,而且Service不是一个单独的进程,也不是一个单独的线程。Service有两种类型:本地服务(Local Service):用于应用程序内部;远程服务(Remote Sercie):用于android系统内部的应用程序之间;前者用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。后者可被其他应用程序复用,例如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。Service的生命周期,Service有startService和bindService两种启动Service方法,
25、每种方法Service的生命周期是不一样的。通过startService() Service会经历 onCreate - onStartCommand(),stopService的时候直接onDestroy,如果是调用者直接退出而没有调用stopService的话,Service会一直在后台运行,下次调用者再起来仍然可以stopService;通过bindService() Service只会运行onCreate()-onBind() 这个时候调用者和Service绑定在一起 unbindService的时候onUnbind() - onDestroyed(),调用者退出了,Srevice就会
26、调用onUnbind() - onDestroyed()。在这里需要注意的是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。3.3.4 Layout布局布局方式有很多种,比如线性布局(Linea
27、r Layout)、相对布局(Relative Layout)、表格布局(Table Layout)、网格视图(Grid View)、标签布局(Tab Layout)、列表视图(List View)和绝对布局(Absolute Layout)。本文设计主要采用线性布局(Linear Layout),所以就线性布局我们来做简单地介绍。线性布局 LinearLayout:线性布局是所用布局中最常用的方式之一,RadioGroup, TabWidget,TableLayout,TableRow,ZoomControls类的父类。LinearLayout可以让它的子元素垂直或水平的方式排成一行(不设置
28、方向的时候默认按照垂直方向排列)。LinearLayout以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元素,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。LinearLayout还支持为单独的子元素指定weight 。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤成一堆的情况,而是允许他们放大填充空白。子元素指定一个weight 值,剩余
29、的空间就会按这些子元素指定的weight比例分配给这些子元素。默认的weight值为0。例如,如果有三个文本框,其中两个指定了weight值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大。3.3.5 控件介绍1. TextView 文本控件,可以用它来显示文字,就像一个标签一样,或者你可以认为是html中的span。对于TextView是怎么设置显示的文本,怎样设置字体的大小,字体的颜色,字体的样式。TextView包含以下子类:Button, CheckedTextView,Chronometer,DigitalClock,EditText。以下简单介绍Te
30、xtView的属性: android:id 控件的标识符 android:layout_width 设置控件的宽度 android:layout_height 设置控件的高度 android:layout_marginTop 设置文本的上外边距 android:textSize 设置文本文字的的大小 android:paddingLeft 设置元素左内边距2. Button 按钮控件,在button内部可以放置内容,比如文本或图像。与标签之间的所有内容都是按钮的内容,其中包括任何可接受的正文内容,比如文本或或多媒体。比如,我们可以在按钮中包括了一个图像和相关的文本,用它们在按钮中创建一个吸引人
31、的标记图像。不过button禁止使用的元素是图像映射,因为它对鼠标和键盘敏感的动作会干扰表单按钮的行为。以下简单介绍Button的属性: android:id 控件的标识符 android:layout_width 设置按钮的宽度 android:layout_height 设置按钮的高度 android:textSize 设置按钮里文字的大小 android:layout_marginTop 设置按钮的上外边距 android:text 设置按钮中的文字 android:visibility 设置按钮里的元素是否可见3. EditText 文本编辑框,TextView的直接子类,所以Edit
32、Text会继成父类TextView的一些方法。在布局中配置EditText也需同时配置一个Button,这样可以在代码中监听Button的事件,以便获取当前在EditView中输入的内容并且显示出来。在EditView可以限制输入的字符串类型。以下简单介绍EditText的属性: android:id 控件的标识符 android:layout_width 设置输入框的宽度 android:layout_height 设置输入框的高度 android:layout_weight 设置输入框占父控件的比例 android:inputType 设置输入框内的字符串类型 android:hint 设
33、置在输入框输入内容前默认的文字4. ImageView 标签可以显示任意图像,例如图标。ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,以便它可以在其他布局中使用,并提供例如缩放和着色等各种显示选项,在本文用来显示天气图片。以下简为ImageView的属性: android:id 设置图片的标识符 android:layout_width 设置图片的宽度 android:layout_height 设置图片的高度 android:visibility 设置图片是否可见性5. ProgressBar 进度条控件,通常在应用程序执行诸如复制文件或打印文档等任务时使
34、用。如果没有视觉提示,应用程序的用户可能会认为应用程序不响应。通过在应用程序中使用 ProgressBar,可以警告用户应用程序正在执行冗长的任务且应用程序仍在响应。以下简单介绍ProgressBar的属性: android:max 设置进度条的最大进度值 android:progress 设置进度条初始化的进度值 android:secondaryProgress 设置二级进度条的值 android:layout_gravity 设置进度条位置 android:style 设置进度条的风格是长方形还是圆形6. CheckBox 复选框,通常用于某选项的打开或关闭,可以选择任意数目的复选框;7
35、.RadioButton 单选框,为用户提供由两个或多个互斥选项组成的选项集。虽然单选按钮和复选框看似功能类似,却存在重要差异:当用户选择某单选按钮时,同一组中的其他单选按钮不能同时选定。相反,却可以选择任意数目的复选框。定义单选按钮组将告诉用户,这里有一组选项,您可以从中选择一个且只能选择一个。第四章 程序设计4.1界面设计4.1.1 当第一次运行程序时,跳转至城市设置界面进行预报城市的选择: 图4-11 设置城市界面4.1.2 用户可以通过单击选择“定位当前城市”的方式调用系统GPS功能自动定位预报城市: 图4-12 自动定位界面4.1.3 用户可通过输入框过滤查询当前系统中预存的城市:
36、图4-13 输入城市界面4.11天气显示界面:4.11.1选择了预报城市后,系统跳转至天气显示界面,显示该城市三天内的实时天气: 图4-111 主界面4.11.2 在天气界面中用户可通过按菜单键来调出菜单,选择城市,更新天气与更换背景 图4-112 更换壁纸界面4.2 项目框架WeatherSystem工程目录结构及其源代码文件如图4-2所示图4-24.3 主要功能实现4.3.1 获取城市码db_weather.db 数据库文件获取全国各地的城市码,是通过访问中央气象局网从省份直辖市到城镇一级一级深入得到的,获得一个地区的城市码总共需要访问4次网络,分别如下:1. 访问01|北京,02|上海,
37、03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,2. 访问1201|济南,1202|青岛,1203|淄博,1204|德州,1205|烟台,1206|潍坊,.3. 访问120101|济南,120102|长清,120103|商河,120104|章丘,120105|平阴,.4. 访问120102|101120102首先实现上述功能需使用Android的网络访问技术,故编写工具类WebAccessTools类如下:由上面访问的可知,得到的编码与名称都是“编码名称”的形式,因此在这也编写一个解析得到城市码的工具类WeatherInfoParser,用于解析从服务器中得到的城市
38、码:编写这两个类后现在就是编写从服务器端用程序遍历得到全国各地的城市名与城市码,并将它们分别的保存在String provinces数组,String childs数组与String cityCode中:接下来就是将得到的上面的三个数组建立数据库文件db_weather.db保存起来,用到android.database.sqlite.SQLiteDatabase类的静态方法:SQLiteDatabase openOrCreateDatabase(String path, CursorFactory factory)来创建一个数据库文件,其中的path表示数据库存放的路径,而factory中游
39、标工厂,这里可将它设为空,从而得到SQLiteDatabase对象,则再调用它的execSQL(String sql)方法来执行保存数据库的操作,从而将上面的三个数组转换为数据库中的数据,最后使用ADT插件中的DDMS工具将得到的数据库文件从Android模拟器中导出,最终就得到了db_weather.db文件。以后上述的代码就可以不使用,直接将db_weather.db文件放入资源文件夹res目录中的raw目录中,则在程序第一次运行时导入到/data/data/com.weather.app/databases目录中就行了,其中关于数据库的导入实际是Java中文件的复制。4.3.2 实现可伸
40、缩性列表的构建与过滤实现可伸缩性列表是通过继承android.widget.BaseExpandableListAdapter适配器实现的,其中主要实现它的public View getGroupView()得列表的一级列表和public void getChildView()得到列表的二级子列表实现的,在这里由于只是实现文本显示功能,故用TextView组件来填充就行了,如果要构造这个自定义的适配器,则只需在提供存放省份直辖市的一级列表的数组String groups和存放对应的城镇的二级列表的String childs就行了。同时为了兼具过滤功能,还要需再实现android.widget.
41、Filterable接口,这个接口有一个getFilter()返回Filter过滤器的列表,故还要提供一个Filter过滤类,在本系统中,实现的是一个内部类CityFilter,它继承android.widget.Filter类,覆盖实现了两个方法,一个是performFiltering()得到FilterResults过滤结果对象方法,另一个是根据得到的FilterResults对象更新适配器的publishResults()方法。其中的performFiltering(CharSequence constraint)方法的实现是通过constraint这个关键字以省份直辖市为单位进行匹配,如果匹配成功,则添加该省份以下的所有城市,如果匹配不成功,则再逐一与这个省份的下的城市配匹,则只添加匹配的城市,其中匹配的结果放在MapInteger,ArrayListvalues这样的向量中,再由新建的FilterResults封装返回,(具体实现如下):1. 首先是对关键字进行判断是否为空,如为空则由values添加所有省份与城市,其中的allGroups和allChilds保存的是所有的省份与对应的城市