收藏 分享(赏)

天气预报APP论文.docx

上传人:gnk289057 文档编号:7218116 上传时间:2019-05-10 格式:DOCX 页数:34 大小:1.63MB
下载 相关 举报
天气预报APP论文.docx_第1页
第1页 / 共34页
天气预报APP论文.docx_第2页
第2页 / 共34页
天气预报APP论文.docx_第3页
第3页 / 共34页
天气预报APP论文.docx_第4页
第4页 / 共34页
天气预报APP论文.docx_第5页
第5页 / 共34页
点击查看更多>>
资源描述

1、目录 摘要 . 1 需求分析 2 一、开发背景 . 2 二、项目需求分析 . 2 总体设计 2 一、系统规划 . 2 二、系统功能界面 . 3 1. 设置预报城市界面: . 3 2天气显示界面: 4 3Widget 桌面小部件界面: . 5 三设计目标 . 6 系统设计 6 一、开发及运行环境 . 6 二、数据库设计 . 6 三、主要方法及步骤 . 7 四、主要方法及技术 . 7 主要模块 7 一、项目框架 . 7 二、主要功能实现 . 8 1.获取城市 码 db_weather.db 数据库文件 8 2.实现可伸 缩性列表的的构建与过滤 . 12 3.GPS 定位功能的实现 . 15 4.W

2、idget 窗体小部件的更新 18 功能测试 19 结论 . 23 1 摘要 Window 操作系统的诞生成就了微软帝国,同时也造就了 PC 时代的繁荣,然而如今,以 Android 和 iPhone 手机为代表的智能移动设备的发明与互联网云技术的兴起却敲响了 PC 时代的丧钟!这也预示着移动互联网时代(3G) 已经来临。 在这个互联网繁荣的时代,有一颗超新星,以它独特性能优势与人性化的 UI 设计使它在短短的几年迅速的占领了智能移动设备的市场份额,它就是 Google 的 Android!这也意味着 Google 在移动互联网时代开始抢跑并领跑。 Android 是基于 Linux 平台完全

3、开源的手机操作系统,同时开发语言为 Java,这对于 Java 开发的我们是何等的诱人,程序员的技术要与时代同行,因此我选择了以 Android 为平台的手机天气预报系统来作为我的毕业设计,选择手机天气预报系统不仅可以提升技术,同时也很实用,为人们时刻了解天气状况和出行带来了方便。 2 需求分析 一、开发背景 近几年来随着 3G 技术成熟和智能手机的不断普及,移动应用的需求与日俱增,移动应用开发成为当下最热门的技术之一。在 Google 和 Android 手机联盟的共同推动下,Android 在众多移动应用开发平台中脱颖而出。Android 是一个真正意义上的开源智能手机操作系统,该系统一经

4、推出立即受到全球移动设备厂商和开发者的热捧。为顺应潮流,本设计旨在搭载 Android 的移动设备上运行,实现天气状况的实时动态更新与显示,方便人们的出行与生活。 二、项目需求分析 根据功能的需求,分析此项目的主要功能应具备以下几点: 1. 精确查询定位全国各地城市未来几天内的实时天气状况 2. 系统要具的实用性,符合用户查看信息习惯,界面设计优美 3. 系统要具有稳定性,且在一定程度上节省流量的开销 总体设计 一、系统规划 由上述的需求,现将系统分为三大模块:天气显示界面模块、预报城市设置模块与 Widget 桌面小部件模块。各系统模块功能如下: 1). 天气显示界面模块 显示指定城市三天内

5、的天气状况,包括日期、城市名称、温度、风力与当日的建议,用户可通过按菜单键来显示菜单更新当前天气与设置天气显示的界面背景,以及跳转至设置预报城市界面来更换预报城市。 2). 预报城市设置模块 由自动设置预报城市与手动设置二部分组成,自动设置实现 GPS 定位功能,自动确定当前用户所在地;而手动设置则通过可伸展性下拉列表单击选择系统数据3 库中预存的城市来进行设置,同时为了方便用户查找,支持以输入框的形式来过滤查询预报城市。当单击选中城市时跳转至天气显示界面,来显示该城市当三天内的天气状况;第一次运行时自动跳到该界面。 3). Widget 桌面小部件模块 为了方便用户实时了解天气状况,特别添加

6、在 Android 系统桌面上显示当前天气与时间的天气小部件,使用户拿起手机的第一时刻就能了解天气,同时当用户单击小部件时,自动跳转至天气显示界面,显示三天内的详细天气。 二、系统功能界面 1. 设 置 预报城市界面: 1.1 当第一次运行程序时,跳转至城市设置界面进行预报城市的选择: 1.2 用户可以通过单击选择“定位当前城市”的方式调用系统 GPS 功能自动定位预报城市: 4 1.3 用户可通过输入框过滤查询当前系统中预存的城市: 2天气显示界面: 2.1 选择了预报城市后,系统跳转至天气显示界面,显示该城市三天内的实时天气: 5 2.2 在天气界面中用户可通过按菜单键来调出菜单,选择城市

7、,更新天气与更换背景: 6 3Widget 桌面小部件界面: 方便用户第一时间了解天气动态,添加 widget 显示功能界面: 三设计目标 设计完成一个实用稳定的天气预报系统,同时要廉价使其能滿足大部分用户的需求,因此针对上述要求,本设计应滿足: 1. 系统能及时的返反馈指定预报城市的天气情况 2. 自动定位用户所在城市,支持 GPS 定位 3. 节省流量开销,规定在指定的时间间隔内才更新天气,其它时段显示缓存的天气 4. 操作方便快捷,使用简单,界面设计美观大方,支持 widget 系统设计 一、开发及运行环境 JDK1.6.10 Eclipse3.5 Android Development

8、 Toolkit (ADT) 15.0.0 Android 2.2 及以上 7 Windows XP 及以上 二、数据库设计 由于在本系统中是通过中央气象台的 WebService 提供的 API 访问得到的天气预报,在查询指定城市的天气时,需要用到它提供的城市码,而城市码相对稳定不变,所以在构建系统时将其事先通过 Android 的网络访问技术将其缓冲到本地 SQLite 数据库进行保存起来,方便以后的查询,同时节省了流量开销。综上所述在本地建立 db_weather.db 的数据库,其中的表结构如下: 其中只存在两个表: provices 和 citys City 中存在 city_num

9、 用天气的查询,同时还存在外键 province_id 与 provices 表形成 1 对 n 的关系。 三、主要方法及步骤 1. 搭建 Android 开发环境,并建立一个 android2.2 版本名为 WeatherSystem 项目 2. 首先编写网络访问代码,访问 http:/ 中央气象站解析得到所有城市码并导出保存得到的 db_weather.db 数据文件 3. 在程序第一次运行时,将 db_weatcher.db 数据库文件导入到应用程序数据库中 4. 建立设置城市界面,读取数据库文件,获取省份,城市以及对应的城市码。 8 5. 接收用户选择的城市码,访问:http:/ 得到

10、天气信息 6. 解析天气信息,将城市码及天气信息缓冲下来,并为其设置有效时间,方便下次启动时直接得到天气信息,过期则从网上更新 7. 定时由保存的城市码更新天气信息 四、主要方法及技术 1. Android 手机的界面 UI 设计 2. Android 的网络通信 3. Android 的广播 4. GPS 调用解析 5. Widget 小部件编程 6. XML 与 JSON 解析 7. SQLite 数据库操作 8. Android 文件操作 主要模块 一、项目框架 在装有 ADT 插件的 Eclipse 中新建一个名为 WeatherSystem 的 Android2.2 版本的项目,项目

11、主要文件结构如下: WeatherSystem |_src | |_com.weather.app | | |_MainActivity.java | | |_SetCityActivity.java | | |_UpdateWidgetService.java | | |_WeatherWidget.java | |_p | | |_GPSListAdapter.java | | |_MyListAdpater.java | |_com.weather.dao | | |_DBHelper.java | |_com.weaher.utils | |_LocationXMParser.java

12、 9 | |_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 | | |_strings.xml | |_xml | |_weather_widget

13、.xml | |_AndroidManifest.xml 二、主要功能实现 1.获 取城市码 db_weather.db 数据库文件 获取全国各地的城市码,是通过访问中央气象局网从省份直辖市到城镇一级一级深入得到的,获得一个地区的城市码总共需要访问 4 次网络,分别如下: 1. 访问 http:/ 得到省份直辖市列表与它的编号: 01|北京,02| 上海,03|天津,04|重庆,05| 黑龙江,06|吉林 ,07|辽宁,08|内蒙古, 2. 访问 http:/ 得到该省份直辖市的城市编号(如访问山东:http:/ 1201|济南,1202|青岛,1203|淄博,1204|德州,1205| 烟台

14、,1206| 潍坊, 3. 访问 http:/ 得到该城市的县区编号(如访问济南:http:/ 10 120101|济南,120102|长清,120103|商河,120104|章丘,120105|平阴,. 4. 访问 http:/ 得到该县区的城市码(如访问长清: http:/ 120102|101120102 首先实现上述功能需使用 Android 的网络访问技术,故编写工具类WebAccessTools 类如下: 11 /* * 根据给定的 url地址访问网络,得到响应内容 (这里为 GET方式访问) * param url 指定的 url地址 * return web服务器响应的内容,为

15、String 类型,当访问失败时,返回为null */ public String getWebContent(String url) /创建一个 http请求对象 HttpGet request = new HttpGet(url); /创建 HttpParams以用来设置 HTTP参数 HttpParams params=new BasicHttpParams(); /设置连接超时或响应超时 HttpConnectionParams.setConnectionTimeout(params, 3000); HttpConnectionParams.setSoTimeout(params, 5

16、000); /创建一个网络访问处理对象 HttpClient httpClient = new DefaultHttpClient(params); try /执行请求参数项 HttpResponse response = httpClient.execute(request); /判断是否请求成功 if(response.getStatusLine().getStatusCode() = HttpStatus.SC_OK) /获得响应信息 String content = EntityUtils.toString(response.getEntity(); return content; e

17、lse /网连接失败,使用 Toast显示提示信息 Toast.makeText(context, “网络访问失败,请检查您机器的联网设备!“ , Toast.LENGTH_LONG).show(); catch(Exception e) e.printStackTrace(); finally /释放网络连接资源 httpClient.getConnectionManager().shutdown(); return null; 12 由上面访问的可知,得到的编码与名称都是“编码名称”的形式,因此在这也编写一个解析得到城市码的工具类 WeatherInfoParser,用于解析从服务器中得到

18、的城市码: /* * 通过解析 content,得到一个一维为城市编号,二维为城市名的二维数组 * 解析的字符串的形式为: 编号|城市名, 编号|城市名,. * param content 需要解析的字符串 * return 封装有城市编码与名称的二维数组 */ public static String parseCity(String content) /判断 content不为空 if(content!=null int count = st.countTokens(); String citys = new Stringcount2; int i=0, index=0; while(st

19、.hasMoreTokens() String city = st.nextToken(); index = city.indexOf(|); citysi0 = city.substring(0, index); citysi1 = city.substring(index+1); i = i+1; 13 return citys; return null; 编写这两个类后现在就是编写从服务器端用程序遍历得到全国各地的城市名与城市码,并将它们分别的保存在 String provinces 数组,String childs 数组与String cityCode 中: WebAccessTool

20、s webTools = new WebAccessTools(this); /得到访问网络的内容 String webContent=webTools .getWebContent(“http:/ /第一次解析得到的为省份或一级直辖市 String provinces = WeaterInfoParser.parseCity(webContent); String groups = new Stringprovinces.length; String childs = new Stringprovinces.length; String cityCode = new Stringprovin

21、ces.length; for(int i=0; i values 这样的向量中,再由新建的 FilterResults 封装返回, (具体实现如下): 16 1. 首先是对关键字进行判断是否为空,如为空则由 values 添加所有省份与城市,其中的 allGroups 和 allChilds 保存的是所有的省份与对应的城市: /当过滤条件为空时,返回所有的省份与城市 if(constraint = null | constraint.length() = 0) for(int i=0; i index = new ArrayList(); /添加所有与之对应的城市 for(int j=0;

22、j index = new ArrayList(); /添加所有与之对应的城市 for(int j=0; j index = new ArrayList(); /如果省份名没有,则查找它下面的城市名是否包含 for(int j=0; j 0) values.put(i, index); else index = null; 3. 得到过滤的结果后将其用 FilterResource 封装后返回: FilterResults res ults = new FilterResults(); results. values = values; results. count = values.size

23、(); 另外的 publishResults(CharSequence constraint, FilterResults results)方法就是根据上面得到的 results 对象来得到新的 String groups 与 String Childs 数组,再调用 BaseExpandableListAdapter 父类的 notifyDataSetChanged()方法来更新列表,从而实现过滤后结果的显示(具体实现如下): 18 1. 首先将参数 FiltersResuls 对象转换为 Map filterResult,然后来判断过滤后的结果长度时否为 0,如果长度为 0 则说明过滤后的

24、结果为空,则调用父类的 notifyDataSetInvalidated()方法来阻止列表的更新: 2. 如果长度不为 0,则说明存在过滤结果,则将它转换为 groups 数组与 childs 数组,并调用 notifyDataSetChanged()方法实再更新: 19 String newGroups = new Stringcount; String newChilds = new Stringcount; int index = 0; int length = 0; /得到新的 groups 和 childs for(int i=0; i citys = filterResult.ge

25、t(i); length = citys.size(); newChildsindex = new Stringlength; for(int j = 0; j 0) WeatherWidget. updateAppWidget(views, this, appWidgetManager, cityCode); appWidgetM anager.updateAppWidget(appids, views); /获取当前时间 设置警报服务 Date date = new Date(); long now =date.getTime(); long unit=60000; /间隔一分钟 int

26、s=date.getSeconds();/得到秒数 unit=60000 -s*1000; /将时间精确到秒 26 pintent= PendingIntent.getService(this, 0, intent, 0); /计时器 alarm=(AlarmManager)getSystemService(Context. ALARM_SERVICE); /AlarmManager.RTC_WAKEUP 设置服务在系统休眠时同样会运行 /第二个参数是下一次启动 service 时间 alarm.set(AlarmManager. RTC_WAKEUP, now+unit, pintent);

27、 2. 然后在实现 AppWidgetProvider 的 widget 类的 onUpdate 方法中启动这个自定义的服务: /启动一个自定义更新 widget 的后台服务 context.startService( new Intent(context,UpdateWidgetService.class); 3. 除了启动这个服务是不够的,当用户删除 widget 部件时,后台服务也必须停止,这样就必须实现 Service 类中的另一个方法 onDestroy()方法,该方法在 Service 停止时调用,在这里用于取消 AlarmManager 设置的警报服务: 27 /当 widget

28、 中通过调用 context.stopService方法来指定销毁 service时,被调用 public void onDestroy() /取消定时管理 if( alarm!=null) alarm.cancel(pintent); super .onDestroy(); 4. 则在 widget 类的 onDisabled()方法中调用 stopService 方法来停止后台服务, 其中的 onDisabled 方法在 widget 被用户删除时由系统自动调用: public void onDisabled(Context context) super.onDisabled(contex

29、t); /关闭后台服务 context.stopService(new Intent(context,UpdateWidgetService.class); 在自定了一个 Service 服务后,系统必须在清单文件 AndroidManifest.xml 中声明自定义的服务: 这 样 就 实 现 了 widget 的 更 新 功 能 , 其 实 在 配 制 widget 的AppWidgetProviderInfo 的配制文件中通过设置 android:updatePeriodMillis 属性来设置 widget 的自动更新,它的单位中毫秒,但由于自动更新对性能的损坏,故它有一个最低值,这最

30、低值长于一分钟,故而与该系统的要求不符,故以调用后台 Service 的方式来解决。 功能测试 28 本系统的的测试,主要是通过手动操作该系统,查看是否存在异常或操作的结果是否符合设计初衷来完成的,现将系统的主要操作结果截图展示如下: 一. 当系统初次启动时,由于没有设置预报城市,则自动由 MianActivity 天气显示视图跳转到 SetCityActivity 城市设置视图,并要求用户选择预报城市,如下: 二. 接下来点击确定选择城市,则系统确定用户单击城市的城市码跳转至天气显示界面,如下: 29 三. 跳转到天气显示界面后,可单击“菜单”按钮来显示天气的菜单: 四. 选择“壁纸”菜单项可以更换程序背景图片如下:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报