1、06-装 订 线- 江苏经贸职业技术学院毕业设计(论文)题目:基于Android 平台的手机天气预报系统设计系 (院)信息技术学院专业班级13软件(单)学 号1326021113学生姓名施梦云校内导师高洁职 称讲师2015年 10月 28 日基于Android 平台的手机天气预报系统设计摘要: 如今智能手机的快速普及飞速发展,手机实用性越来越强,方便让智能手机用户能够随时更好的查询知道网络所提供的服务,好而有效的方法就是将应用系统的功能发展到手机终端上,因此,智能手机的发展对未来是有很大的帮助的! 首先天气预报是非常实用的信息服务,所以特推出名为Android的开源手机操作系统,采用Linux
2、内核,开发手机联盟成员可以任意使用修改SDK宝。利用手机终端实施查询天气预报,能让大家更能快捷了解想知道的天气信息,这款软件包括了操作系统,用户界面等。关键词:Android 手机天气预报系统 定位Design and Development of Weather Forecast System based on the Android SystemAbstract:Nowaday, the smart phones are developing faster and faster, mobile phones are more practical, convenient for smart
3、phone users to better know the services provided by the network, good and effective way is to develop the application system to the mobile terminal, so the smart phones will have very importance for development.First weather forecast is very practical information services, so the launch of the Andro
4、id open source mobile phone operating system, the use of the Linux kernel, the development of mobile phone alliance members can be used to modify the SDK. Using the mobile terminal to implement the query weather forecast, so that we can more quickly learn to know the weather information, the softwar
5、e includes the operating system, user interface, etc.Keywords:Android mobile weather forecast system Location - 25 - 目录摘要1第一章 概述 1.1 项目背景11.2 项目意义11.3 研究现状和发展趋势1第二章 系统设计 2.1 软件环境2 2.2 主要方法及技术2 2.3 主要方法3 2.4 数据库设计3 2.5 设计目标3第三章 需求分析3.1 经济可行性43.2 系统功能分析43.3 性能分析43.4 系统架构图4第四章 系统设计4.1 系统模块54.2 系统功能6第五章
6、 主要模块 5.1 项目架构7 5.2 主要功能实现85.2.1 数据库实现95.2.2数据库文件105.2.3数据库代码115.2.4数据库代码125.2.5 GPS定位实现13第六章 功能测试 6.1功能测试18 结论24 参考文献25基于Android 平台的手机天气预报系统设计第一章 概述1.1项目背景近年来随着 3G 技术成熟使用广泛,网络的应用与日俱 增,网络应用开发技术成为当下最热潮的技术之中。在 Google 和 Android 手机联盟 的共同推动下,Android 系统在许多移动网络应用开发中最为火热受到追捧。Android 系统是一个有意义的操作系统,此系统刚一出现就为大
7、量的商家及其顾客们的热潮。故而为顺应潮流,了解未来移动互联网的发展趋势,开拓Android应用平台市场,更好的去迎合社会的需求。1.2项目意义 由于Android平台3G手机气象软件开发可以对扩大覆盖面很有利,同时可以使得广大群众提前就得知所在的城市天气信息,能够预先得知预防,降低了很多的不必要的灾害。并且能够更好的强化相应的功能,完善公共更好的服务体系、改善公共服务手段、增加公共服务产品、提高服务质量,发挥气象事业对经济社会发展的现实性作用更好的状态。 1.3 研究现状和发展趋势 随着现如今4G网络的飞速发展,智能手机应用普及,安卓占全球手机市场的25.5%,仅次于塞班,成为第二大智能手机系
8、统。安卓系统是第一次开源代码的操作系统,Linux内核,可以随时提取和完善安卓系统的SDK软件包。 我们相信,安卓系统在全球市场的成长壮大操作系统迅猛发展,有着良好的产业运作策略,计旨在搭载 Android 的移动设备上运行, 实现天气状况的实时动态更新与显示,方便人们这些特点将为安卓在智能手机市场赢得很好的发展机遇。此系统免费让代码的开源更多的开发者进入应用开发;或许同时谷歌值得众多厂商所学习的,不停的发现更好的版本,将系统推广到更多终端产品中,确保大家更好的体验。- 25 -第二章 系统设计2.1 软件环境(1)Java SDK(2)JDK1.6.10(3)Eclipse 3.5(4)An
9、droid2.2及以上(5)操作系统:Windows XP及以上(6)ADT(7)数据库:SQLite2.2 主要技术 1.Android手机的界面UI设计 2.Android的网络通信 3.Android的广播 4.GPS调用解析 5.Widget小部件编程 6.XML与JSON解析 7.SQLite数据库操作 8.Android文件操作 2.3 主要方法;(1) 首先搭建Android平台 ,建立一个名为android2.2的项目名为WeatherSystem项目, ( 2)其次编写网络访问代码,访问:(3) 在程序第一次运行时,将db_weather.db数据库文件导入到应用程序数据库中
10、(4) 建立设置城市界面,读取数据库文件,获取身份,城市以及对应的城市码。(5)接收用户选择的城市码,访问:(6)解析天气信息,将城市码及天气信息缓冲下来,并为其设置有效时间,方便下次启动时直接得到天气信息,过期则从网上更新(7)定时由保存的城市码更新天气信息 双击Eclipse解压后目录中得到eclipse启动2.4 数据库设计 因为系统中通过中央气象台的WebService提供的API访问的得到的天气预报,故当需要查询哪城市时,需要它提供的城市码,而城市码的相对稳定一样,因此在构建系统时将他提前通过Android的网络访问技术将其缓冲到本地SQLite数据库进行保存起来,对于后面的询查很有
11、利。并产生流量费用呢。综合所述在本地简历db_weather.db的数据,表结构如下 :其中只存在两个表:provices 和citysCity中存在对city-num 对天气的查询,同时还存在外键province_id与provices表,形成1对n 的关系。 系统架构图 2.5 设计目标 为了完成一个实用稳定的天气预报系统,而且廉价并能满足足大用户的需求,由此针对上述目标,该设计要满足的是:1:系统能及时的反馈制定预报城市的天气情况2:自动定位用户所在城市,支持GPS定位3:控制流量消耗,使得只能在规定的时间间隔期间才刷新气象信息,其余时间只需显示缓存的天气4:操作方便,使用便利,界面设计
12、美观简洁,支持widget第三章 需求分析 3.1 经济可行性 系统开发使用或及利用的软件都是免费开放开源下载,所有系统在经济上是可行的。3.2 系统功能分析 该软件是APP widget的一个应该小程序,启动后可以进行城市、更新与查询相应的天气信息,可以通过图片和文字显示当前的一级未来的天气状况等,包括温度,湿度,风向,淤血情况等。这些天气细腻是根据后台数据库等服务显示的,服务相应的按照的时间间隔,从Google上获取相应天气预报信息。 3.3 性能分析程序响应速度快,处理信息快 具有相应安全保障等3.4系统架构图第四章 系统设计 4.1 系统模块 根据相应的需求,将系统分为主要三大模块:天
13、气信息、预报城市设置与 Widget 桌面小部件模块。相应系统模块功能如下:1). 天气信息显示指定城市三天内的天气状况,包括年月日、城市名称、温度、风力与当天的建议等,用户可通过按菜单键来显示菜单更新当前天气与设置天气显示的界面 背景,以及跳转至设置预报城市界面来更换预报城市。2). 预报城市设置 由自动设置预报城市与手动设置二部分组成,自动设置实现GPS 定位功能,自动确定当前用户所处位置,手动设置则通过可伸展性下拉列表单击选择系统数据库中预存的城市来进行设置,为了用户方便使用,支持以输入框的形式来过滤查询预报城市。当单击选中城市时跳转至天气显示界面,会显示出城市当三天内的天气状况信息;首
14、次运行时跳转至该页面。3). Widget 桌面小部件模块使得用户更快捷方便的实时了解天气状况信息,添加在 Android 系统桌面上显示当前天气与时间的天气小部件,用户拿起手机就能了解天气信息,并且当用户单击小部件时,将会自动跳至天气显示界面,并显示出三天的天气信息情况。4.2 系统功能 设置预报城市界面: 首次运行程序,跳至该城市设置界面进行预报城市的选择如图: 天气显示界面:选择了预报城市后,系统跳转至天气显示界面,显示该城市三天内的实时天气: 在天气界面中用户可通过按菜单键来调出菜单,选择城市,更新天气与更换背景 小部件Widget显示 方便用户第一时间了解天气动态,添加widget显
15、示功能界面: 第五章 主要模块 5.1 项目结构装有ADT插件的Eclipse中建一个名为WeatherSystem的Android2.2版本的项目,项目文件结构如下: WeatherSystem|_ src| |_com.weather.app| | |_MainActivity.java| | |_SetCityActivity.java| | |_UpdateWidgetService.java| | |_WeatherWidget.java|_p| | |_GPSListAdapter.java| | |_MyListAdpater.java| |_com.weather.dao| |
16、 |_DBHelper.java| |_com.weaher.utils| |_LocationXMParser.java| |_WeatherInfoParser.java| |_WebAccessTools.java|_res| |_drawable| |_(略)| |_layout| | |_gps.xml| | |_main.xml| | |_widget_layout.xml| | |_set_city.xml|_menu| | |_configure_menu.xml| |_raw| | |_db_weather.db| |_values| | |_color.xml| | |_s
17、trings.xml| |_xml| |_weather_widget.xml|_AndroidManifest.xml 5.2.主要功能实现 获取城市码db_weather.db数据库文件 通过访问中央气象局网从省份直辖市到城镇一级一层的深入,得到全国的城市码,如果需要获得一个地区的城市码总共需要访问4次网络,分别如下:1:访问 01|北京,02|上海,03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,2. 访问 1201|济南,1202|青岛,1203|淄博,1204|德州,1205|烟台,1206|潍坊,3. 访问 120101|济南,120102|长清,120
18、103|商河,120104|章丘,120105|平阴,.4. 访问: 120102|101120102首先实现上述功能需使用Android 的网络访问技术,故编写工具类WebAccessTools类如下:/* * 根据给定的url地址访问网络,得到响应内容(这里为GET方式访问) * param url 指定的url地址 * return web服务器响应的内容,为String类型,当访问失败时,返回为null */ public String getWebContent(String url) /创建一个http请求对象 HttpGet request = new HttpGet(url);
19、 /创建HttpParams以用来设置HTTP参数 HttpParams params=new BasicHttpParams(); /设置连接超时或响应超时 HttpConnectionParams.setConnectionTimeout(params, 3000); HttpConnectionParams.setSoTimeout(params, 5000); /创建一个网络访问处理对象 HttpClient httpClient = new DefaultHttpClient(params); try /执行请求参数项 HttpResponse response = httpClie
20、nt.execute(request); /判断是否请求成功 if(response.getStatusLine().getStatusCode() = HttpStatus.SC_OK) /获得响应信息 String content = EntityUtils.toString(response.getEntity(); return content; else /网连接失败,使用Toast显示提示信息 Toast.makeText(context, 网络访问失败,请检查您机器的联网设备!, Toast.LENGTH_LONG).show(); catch(Exception e) e.pr
21、intStackTrace(); finally /释放网络连接资源 httpClient.getConnectionManager().shutdown(); return null; /* * 根据给定的url地址访问网络,得到响应内容(这里为GET方式访问) * param url 指定的url地址 * return web服务器响应的内容,为String类型,当访问失败时,返回为null */ public String getWebContent(String url) /创建一个http请求对象 HttpGet request = new HttpGet(url); /创建Http
22、Params以用来设置HTTP参数 HttpParams params=new BasicHttpParams(); /设置连接超时或响应超时 HttpConnectionParams.setConnectionTimeout(params, 3000); HttpConnectionParams.setSoTimeout(params, 5000); /创建一个网络访问处理对象 HttpClient httpClient = new DefaultHttpClient(params); try /执行请求参数项 HttpResponse response = httpClient.execu
23、te(request); /判断是否请求成功 if(response.getStatusLine().getStatusCode() = HttpStatus.SC_OK) /获得响应信息 String content = EntityUtils.toString(response.getEntity(); return content; else /网连接失败,使用Toast显示提示信息 Toast.makeText(context, 网络访问失败,请检查您机器的联网设备!, Toast.LENGTH_LONG).show(); catch(Exception e) e.printStack
24、Trace(); finally /释放网络连接资源 httpClient.getConnectionManager().shutdown(); return null; 通过上面访问清楚,得到的编码与名称都是“编码|名称”的形式,所以在此也编写一个解析得到城市码的工具类WeatherInfoParser,以便解析从服务器中得到的城市码:/* * 通过解析content,得到一个一维为城市编号,二维为城市名的二维数组 * 解析的字符串的形式为: 编号|城市名,编号|城市名,. * param content 需要解析的字符串 * return 封装有城市编码与名称的二维数组 */ public
25、 static String parseCity(String content) /判断content不为空 if(content!=null&content.trim().length()!=0) StringTokenizer st=new StringTokenizer(content, ,); int count = st.countTokens(); String citys = new Stringcount2; int i=0, index=0; while(st.hasMoreTokens() String city = st.nextToken(); index = city
26、.indexOf(|); citysi0 = city.substring(0, index); citysi1 = city.substring(index+1); i = i+1; return citys; return null; 编写这两个类后就是编写从服务器端用程序遍历得到全国各地的城市名与城市码,并将它们分别的保存在Stringprovinces数组,Stringchilds数组与StringcityCode中:WebAccessTools webTools = new WebAccessTools(this); /得到访问网络的内容 String webContent=webT
27、ools.getWebContent( /第一次解析得到的为省份或一级直辖市 String provinces = WeaterInfoParser.parseCity(webContent); String groups = new Stringprovinces.length; String childs = new Stringprovinces.length; String cityCode = new Stringprovinces.length; for(int i=0; i provinces.length; i+) groupsi = provincesi1; /由省份码来得到
28、城市码 StringBuffer urlBuilder= new StringBuffer( urlBuilder.append(provincesi0); urlBuilder.append(.xml); webContent = webTools.getWebContent(urlBuilder.toString(); String citys = WeaterInfoParser.parseCity(webContent); /用于保存所的有towns String towns = new Stringcitys.length; /计算总的城镇数 int sum=0; for(int j
29、=0; jcitys.length; j+) /由城市码来得到地方码 urlBuilder= new StringBuffer( urlBuilder.append(citysj0); urlBuilder.append(.xml); webContent = webTools.getWebContent(urlBuilder.toString(); townsj = WeaterInfoParser.parseCity(webContent); sum = sum + townsj.length; childsi = new Stringsum; cityCodei = new String
30、sum; sum=0; for(int j=0; jcitys.length; j+) for(int n=0; ntownsj.length; n+) if(n=0) childsisum = townsjn1; else childsisum = townsj01 + . + townsjn1; urlBuilder= new StringBuffer( urlBuilder.append(townsjn0); urlBuilder.append(.xml); webContent = webTools.getWebContent(urlBuilder.toString(); String
31、 code=WeaterInfoParser.parseCity(webContent); cityCodeisum = code01; sum = sum + 1; urlBuilder=null; 接下来就是将得到的上面的三个数组建立数据库文件db_weather.db保存起来,用到android.database.sqlite.SQLiteDatabase类的静态方法:SQLiteDatabase openOreateDatabase(String path,CursorFactory)来创建一个数据库文件,其中的path表示数据库存放的路径,而factory中游标工厂,这里可将它设为空
32、,从而得到SQLiteDatabase对象,则 再调用它的execSQL(String sql)方法来执行保存数据库的操作,从而将上面的三个数组装换为数据库的数据,最后使用ADT插件中的DDMS工具将得到的数据库文件Android模拟器中导出,最终就得到了db_weather.db文件。以后上述的代码就可以不使用,直接将db_weather.db文件放入资源文件夹res目录中的raw目录中,则在程序第一次运行时导入到/data/data/com.weather.app/app/databases 目录中就行了,其中关于数据库的导入实际是Java中文件的复制。(1)实现可伸缩性列表的构建与过滤
33、实现可伸缩性列表是通过继承android.widget.BaseExpandableListAdapter适配器实现的,其中主要实现它的public View getGroupView()得到列表的一级列表和public void getChildView()得到列表的二级子列表实现的,在这里由于只是实现文本显示功能,故用TextView组件来填充就行了,如果要构造这个自定义的适配器,则只需在提供存放省份直辖市的一级列表的数组Stringgroups和存放对应的城镇的二级列表的Stringchild就行了。 同时为了兼具过滤功能,还要需实现android.widget.Filterable接口
34、,这个接口有一个getFiler()反悔Filter过滤器的列表,故还要提供一个Filter过滤类,在本系统张,实现的是一个内部类CityFilter,它继承android.widget.Filter类,覆盖实现了两个方法,一个是performFiltering()得到FilterResults过滤结果对象方法,另一个是根据得到的FilterResults对象更新适配器的publishResults()方法。 其中的performFiltering(CharSequence constranit)方法的实现是通过constranit这个关键字以省份直辖市为单位进行匹配,如果匹配成功,则添加该省
35、份一下的所有城市,如果匹配不成功,则再逐一与这个省份的下的城市匹配,则只添加匹配的城市,其中匹配的结果放在MapInteger,ArrayListvalues这样的向量中,再由新建的FilterResults封装返回(具体实现如下): 1.首先是对关键字进行判断是否为空,如为空则由values添加所有省份与城市,其中的allGroups和allChilds保存的是所有的省份与对应的城市:/当过滤条件为空时,返回所有的省份与城市 if(constraint = null | constraint.length() = 0) for(int i=0; iallGroups.length; i+)
36、ArrayList index = new ArrayList(); /添加所有与之对应的城市 for(int j=0; jallChildsi.length; j+) index.add(j); values.put(i, index); 2. 如果关键字constranint不为空,则以省份为单位进行匹配,省份匹配的添加下面的所在城镇,如果不匹配,会进行深入匹配城镇,直至添加符合条件的城镇:String filterStr = constraint.toString(); for(int i=0; iallGroups.length; i+) /查找省名是否包含用户输入的字符串 if(al
37、lGroupsi.contains(filterStr) ArrayList index = new ArrayList(); /添加所有与之对应的城市 for(int j=0; jallChildsi.length; j+) index.add(j); values.put(i, index); else ArrayList index = new ArrayList(); /如果省份名没有,则查找它下面的城市名是否包含 for(int j=0; j 0) values.put(i, index); else index = null; 3.得到过滤的结果后将其用FilterResource
38、封装后返回:FilterResults results = new FilterResults(); results.values = values; results.count = values.size(); 另外的publishResults(CharSequence constraint,FilterReaults results)方法就是根据上面得到的results对象来得到新的Stringgroups与StringChilds数组,再调用BaseExpandableListAdater父类的notfyDataSetChanged()方法来更新列表,从而实现过滤后结果的显示(具体实现
39、如下):1.首先将参数FiltersResults对象转换为MapInteger,ArrayListfilterResult,然后来判断过滤后的结果长度是否为0,如果长度为0则说明在过滤后的结果为空,则调用父类的notifyDataSetInvalidated()方法来阻止列表的更新:String newGroups = new Stringcount; String newChilds = new Stringcount; int index = 0; int length = 0; /得到新的groups和childs for(int i=0; iallGroups.length; i+) if(filterResult.containsKey(i) newGroupsindex = allGroupsi; /符合条件的城市 ArrayList citys = filterResult.get(i); length = citys.size(); newChildsindex = new Stringlength; for(int j = 0; j length; j+) newChildsindexj = allChildsicitys.get(j); index = index + 1; /设置groups和childs group