基于Android的天气预报短信系统的毕业设计说明书.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Android 天气预报 短信 系统 毕业设计 说明书
- 资源描述:
-
信息工程学院本科生毕业设计说明书 题目:基于Android的天气短信系统的设计与实现 姓 名:丁柏林 学 号:2011110262 专业:计算机科学与技术 班 级:11计科2班 指导教师:房爱东 目 录 1 系统概述1 1。1 设计目的1 1.2 设计思路1 1.3系统需求分析1 1。4开发环境2 1。4.1 Android开发环境的介绍2 1.4.2 Android的开发平台搭建2 1。5 运行环境3 1。6 参考文献3 2。总体设计4 2。1系统结构4 2.1.1 系统流程图4 2。1。2 模块结构图4 2。2数据库的设计5 2.3 模块功能设计6 2.3。1 获取当前天气功能6 2.3.2 选择城市的功能6 2.3。3 发送短信的功能6 3。运行设计7 3。1用户界面设计7 3.2 运行代码9 4。系统测试25 4。1功能性测试25 4.2 稳定性测试27 4。3 安全性测试27 5 结论28 2015届本科生毕业设计说明书 系统概述 1 系统概述 近几年来随着3G 技术成熟和智能手机的不断普及,移动应用的需求与日俱增,移动应用开发成为当下最热门的技术之一.在Google和Android 手机联盟的共同推动下,Android在众多移动应用开发平台中脱颖而出.Android是一个真正意义上的开源智能手机操作系统,该系统一经推出立即受到全球移动设备厂商和开发者的热捧。为顺应潮流,本设计旨在搭载 Android 的移动设备上运行,实现天气状况的实时动态更新与显示,并将显示的天气可以发短信给指定的联系人. 1。1 设计目的 天气软件是一种非常实用的信息服务,随着智能手机的不断普及,各种智能手机平台下都有各种各样的天气软件。Android作为现在主流的智能手机之一,自然也需要这方面的软件.天气关系到人们的日常生活,如告知温暖,方便出行等。此外,对未来天气的预测你还可以指定发短信给家里不会上网的父母,帮助父母进行农作物的浇灌、施肥、收割等工作. 1.2 设计思路 天气短信这个设计不算复杂,我先在eclipse里面把系统的主界面写好,然后先是联网解析从360天气预报端口读取来的数据,数据解析完了在本地创建数据库,把联网解析的数据保存在本地,减少流量的使用。之后就是选择想要的城市来获取当前城市未来的天气情况,并把天气情况编辑成样例短信,最后选择联系人在指定的时间发送短信,最后就是短信发送成功之后会提醒的消息推送通知。 1.3系统需求分析 本软件是一个基于Android的应用程序,启动程序后可以进行城市的选择设置,可以通过文字显示当前和未来的天气状况,包括温度、湿度、风向和雨雪情况等。这些天气数据是通过后台服务获取的,这个后台服务可以按照一定时间间隔,从360上获取天气预报信息,并将天气信息保存在数据库中。可以选定指定的联系人并且设置指定的时间发送天气短信给对方。 从上面的描述中可以基本了解软件的功能需求: (1)启动Android的应用程序; (2)设置界面:对要显示天气预报的城市进行设置; (3)显示界面:通过文字显示当前的天气情况,包括日期、时间、城市、最高温度、最低温度、当前温度等。而且可以选定指定的联系人在指定的时间发送天气短信给对方. 1。4开发环境 1。4.1 Android开发环境的介绍 Android平台使用Java编程语言来开发应用程序,而Android提供了对Java的核心支持。考虑到Java虚拟机的执行效率和占用资源情况,Google重新设计了Java的编译器,命名为Dalvik.Dalvik是经过优化的Java编译器,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。 项目的开发在Eclipse环境中进行,由于进行的是Android应用程序的开发,需要在Eclipse安装ADT插件,即Android开发工具,这样Eclipse就可以和Android SDK建立连接,在Eclipse中启动Android模拟器、调试程序等工作. 由以上分析可知,Android平台的搭建需要Android SDK、Java SDK、Eclipse和ADT四个软件. 1。4.2 Android的开发平台搭建 在进行Android应用程序的开发前,要先搭建Android平台,然后才能在开发环境中进行编程。根据官方指导,对Android平台的搭建过程介绍如下: 首先,在官方网址上下载JDK6.0并安装,网址是http:// 然后,在官方网址上下载更新的SDK进行安装,官方网址为http://development。android。com/sdk/index.html,下载完后解压到指定文件夹,启动SDK Manager进行安装,选择需要的Android版本,然后更新,这次更新需要的时间比较慢,所以更新前要做好准备.安装完成后,将ADB命令所在的目录platform-tools的完整路径添加到系统的环境变量PATH中,就能够在命令中使用ADB命令了; 接下来要安装的是ADT插件,即Android开发工具。因为ADT在线安装容易遇到问题,增加一些不必要的麻烦所以需要下载后在本地安装。指定网址为http://development。android。com/sdk/index。html,下载存放在指定的位置以便后面使用; 最后,下载Eclipse,建议选择Eclipse3。4以上版本,网址为http://www.eclipse。org/downloads/,解压到指定位置后运行.选择Eclipse菜单中的Help〉Install New Software选项卡上的Available Software,点击右侧的Add,然后在Name框中填写Android,在Location框中选择上步下载的ADT文件,然后点击OK>Finish〉Install All,这时关闭Eclipse再重新启动。重启后选择Eclipse菜单中的Window〉Preferences,在左侧的Android项目中SDK Location中填入Android SDK解压后的目录,然后点击Apply. 这样,整个平台的搭建工作就完成了。 1.5 运行环境 运行需要Android SDK、Java JDK、Eclipse和ADT四个软件,以及Android2。2的虚拟机或者真机,操作系统为Windows7的PC机一台 1.6参考文献 [1] 王向辉,张国印,沈洁.Android应用程序开发[M]。北京:清华大学出版社,2012 [2] 李刚。 疯狂Android讲义[M]。 北京:电子工业出版社,2013 [3] 明日科技。 Android从入门到精通[M]。 北京:清华大学出版社,2012 [4] 李刚. 疯狂Java讲义[M]。 北京:电子工业出版社,2013 [5]Y。Daniel Liang. Java语言程序设计(李娜)[M]。 北京:机械工业出版社,2011 [6]邓凡平.深入理解Android[M]。 北京:机械工业出版社,2011 [7] 马超,孙仁贵.Android应用开发全程实录[M]. 北京:人民邮电出版社,2012 [8] 刘昌平,范明钰.Android手机的轻量级访问控制[J]。计算机应用研究,2010,7:201—212。 [9] 张仕成。基于Google Android平台的应用程序开发与研究[J]。电脑知识与技术,2009:35-59。 [10] 杨丰盛。Android应用开发揭秘[M]。北京:机械工业出版社,2010 25 2015届本科生毕业设计说明书 总体设计 2。总体设计 2。1系统结构 2。1。1 系统流程图 本系统的流程是当我们在桌面上打开软件时进入到用户的主界面,进入主界面后第一次是会让我们选择城市,我们点击城市的下拉列表选中自己想要查询的城市,在我们的短信中会出现该城市的天气并生成样列短信,最后我们设置指定的联系人并设置指定的时间发送短信到指定的联系人,当短信发送成功后我们会收到来自通知栏的消息告诉我们短信已经发送成功. 图2—1系统流程图 2.1。2 模块结构图 后台服务 App启动 App启动服务 用户界面 设置相关信息 天气信息 startService(new Intent) 启动服务 数据库获取模块 360天气预报服务 设置联系人和发送时间 SQLite 数据库获取模块 发送短信并返回发送成功的通知 图2-2模块结构图 2.2数据库的设计 由于在本系统中是通过中央气象台的WebService 提供的API访问得到的天气预报,在查询指定城市的天气时,需要用到它提供的城市码,而城市码相对稳定不变,所以在构建系统时将其事先通过Android的网络访问技术将其缓冲到本地SQLite数据库进行保存起来,方便以后的查询,同时节省了流量开销.综上所述在本地建立db_weather.db的数据库,其中的表结构如下: 图2—3数据库表结构 其中只存在两个表: provices 和citys City 中存在city_num用天气的查询,同时还存在外键province_id与provices表形成1对n的关系。 2。3模块功能设计 2.3。1 获取当前天气功能 显示指定城市三天内的天气状况,包括日期、城市名称、温度、风力,用户可通过选择城市来获取城市天气,并且可以把天气编辑成短信。 2。3.2 选择城市的功能 通过手动选择可伸展性下拉列表单击选择系统数据库中预存的城市来进行设置,同时为了方便用户查找,当单击选中城市时跳转至天气显示界面,来显示该城市当三天内的天气状况. 2。3.3 发送短信的功能 为了使用户能够选择指定的联系人,在界面上加上了选择联系人的输入框,并且还有时间选择,是用户能够设置在指定的时间发送短信给指定的人。 2015届本科生毕业设计说明书 运行设计 3。运行设计 3.1用户界面设计 根据需求分析可以知道,应用程序应包含三个主要的功能,这里需要进一步分析每个功能中应该具体怎样实现。 在获取网络上的天气服务时应该做到读取未来三天的天气,并把天气转为短信内容示例.当然我们可以选择当前城市的信息,设置省市联动的效果,并且我们可以设置指定联系人的信息和在什么时间发送短信。 根据以上的功能分析得到以下的用户界面图: 图3—1主界面布局 图3—2用户主界面 图3—3选择省份 图3—4选择城市 3.2 运行代码 根据天气预报系统功能需求分析,系统启动后,应在主界面上呈现出,默认城市的天气数据,因此需要创建主界面和解析天气的类,包括获取、解析城市天气数据,并在用户界面上呈现出来。为此,需要解决的问题是手机终端从Web 服务器获取了所有类型的数据之后,将这些数据进一步交给Android 手机终端View 组件,在手机界面上显示给用户。联网获取天气情况并把天气情况变为样例短信.主要是通过360天气预报的端口从网络上解析数据,并把数据保存到本地的数据库中,在从数据库中调取所需城市的天气,并把天气转为示例代码: //重写callable接口中的方法call @SuppressLint("SimpleDateFormat”) @Override public String call() throws Exception { try{ //这里使用的是360天气预报,比较几个之后,发现这个比较靠谱 //url最后的101010100 是指北京,在http://cdn。 //联网读取天气数据 //创建连网使用的客户端连接类httpclient,以及本次请求的封装对象httpget HttpGet httpGet = new HttpGet( ”http://cdn.weather。hao。 HttpClient httpClient = new DefaultHttpClient(); //执行请求并获取服务器的响应 HttpResponse httpResponse = httpClient。execute(httpGet); //获取http的响应码,判断本次连接是否成功 if (httpResponse.getStatusLine()。getStatusCode() == HttpStatus.SC_OK) { //获取响应数据的字符串内容并针对字符串进行拆分 String unicodeResult = EntityUtils。toString( httpResponse。getEntity()).split(”\\(”)[1] .split(”\\)")[0]; // unicode解码后获取各节点的值 // 获取市 //System.out。println(unescapeUnicode(unicodeResult)); timestamp=(new JSONObject(unicodeResult)。getLong("time")); //System.out.println(timestamp); //通过stringbuffer实现字符串的拼接 weatherMsg.append( new JSONObject(unicodeResult)。getJSONArray(”area") .getString(2)。split("\”")[1]).append(";”); JSONArray jsonArray = new JSONObject(unicodeResult) 。getJSONArray(”weather”); for (int i = 0; i 〈 jsonArray。length(); i++) { JSONObject jsonDay = jsonArray。getJSONObject(i); // 获取日期几月几日 weatherMsg.append(sdf2。format(sdf。parse(jsonDay .getString("date”)))); JSONObject jsonInfo = jsonDay.getJSONObject(”info"); String[] dayInfo = jsonInfo.getString(”day") 。split("\"”); String[] nightInfo = jsonInfo.getString("night”)。split( ”\""); if (dayInfo[3].equals(nightInfo[3])) { weatherMsg。append(dayInfo[3])。append(”#”); } else { weatherMsg.append(dayInfo[3])。append(”转") 。append(nightInfo[3]).append("#"); } if (!(dayInfo[9].equals(”微风"))) { if (dayInfo[7]。equals(nightInfo[7])) { weatherMsg。append(dayInfo[7]); if (dayInfo[9].equals(nightInfo[9])) { weatherMsg。append(dayInfo[9]).append(”#"); } else { weatherMsg.append("白天")。append(dayInfo[9]); weatherMsg。append("夜间") 。append(nightInfo[9]).append(”#”); } } else { weatherMsg.append("白天")。append(dayInfo[7]) 。append(dayInfo[9])。append(”#”); if (!(nightInfo[9]。equals(”微风”))) { weatherMsg。append(”夜间") .append(nightInfo[7]) 。append(nightInfo[9])。append(”#"); } } } elseif (!(nightInfo[9].equals(”微风"))) { weatherMsg。append(”夜间”)。append(nightInfo[7]) 。append(nightInfo[9])。append("#"); } weatherMsg。append(nightInfo[5]).append(”~") .append(dayInfo[5])。append("度;"); } weather = weatherMsg.substring(0, weatherMsg。length() — 1); weathers = weather。split(”;”); //将weathers数组转成集合后,toString再转成字符串 weather = Arrays。asList(weathers)。toString(); // 4 day for(int i=0;weather.length()〉70;i++) { System.out。println(weather.length()); //将数据转成集合,然后通过sublist方法截取集合中的部分内容后,将截取后的集合toString的到字符串 weather = Arrays。asList(weathers)。subList(0, Arrays.asList(weathers)。size()—i)。toString(); } //针对字符串进行字符的替换 weather = weather.replace(”[”, ”")。replace(”]”, ””)。replace(” ”, "”)。replace(”,”, ";”)。replace(”#”, ”,"); //String date = new java.text.SimpleDateFormat("HH:mm")。format(new java。util.Date(timestamp * 1000)); //weather = weather + ";" + date + ”发布”; returnweather; } } catch (Exception e) { e。printStackTrace(); } returnnull; } public String unescapeUnicode(String str){ StringBuffer sb=new StringBuffer(); //将字符串根据制定的正则表达式进行匹配(可简单的理解为将特殊的字符串根据指定的方式进行拼配后替换) Matcher matcher = Pattern。compile("\\\\u([0—9a-fA—F]{4})”)。matcher(str); while(matcher。find()){ //如果字符串中包含指定字符 //则对字符串进行退换操作 matcher。appendReplacement(sb, (char)Integer.parseInt(matcher。group(1),16)+"”); } matcher.appendTail(sb); return sb.toString().replace("\\”, ””);//顺便去掉上面的转义字符”\\” } 根据天去短信系统的需求分析,选择城市并获取天气的类,通过连接本地的SQLite数据库根据城市的城市码来到本地的数据库中找到并把天气显示在用户的界面上,具体实现代码如下: publicvoid initSpinner1(){ dbm = new DBManager(this); dbm.openDatabase(); db = dbm.getDatabase();//获取数据库对象 List<MyListItem> list = new ArrayList〈MyListItem>(); try { String sql = ”select * from provinces”; //查询数据库中的provinces表中的数据 Cursor cursor = db。rawQuery(sql,null); cursor。moveToFirst(); //如果有多行数据,就循环读取表中每一行的数据 while (!cursor。isLast()){ //获取表中列名为_id的列中当前行的值 String code=cursor。getString(cursor。getColumnIndex("_id”)); System。out.println(”initSpinner1"+code); //获取表中第二列中当前行的数据值 byte bytes[]=cursor。getBlob(1); String name=new String(bytes,"utf—8"); //初始化列表中每个item中要显示的数据封装类对象 MyListItem myListItem=new MyListItem(); myListItem。setName(name); myListItem.setPcode(code); list.add(myListItem); //让游标移动到下一行 cursor.moveToNext(); } //如果没有多行数据,那么就读取当前行的数据 String code=cursor。getString(cursor.getColumnIndex(”_id")); byte bytes[]=cursor.getBlob(1); String name=new String(bytes,”utf—8"); MyListItem myListItem=new MyListItem(); myListItem。setName(name); myListItem.setPcode(code); list.add(myListItem); } catch (Exception e) { } MyAdapter myAdapter = new MyAdapter(this,list); spinner1.setAdapter(myAdapter); String sql = ”select province_id from citys where city_num='"+areaCode+”’"; //查询数据库中指定城市的province_id Cursor cursor = db.rawQuery(sql,null); cursor。moveToFirst();//将游标移动到表中第一行 spinner1.setSelection(cursor.getInt(0), true);//设置spinner默认选项 //设置spinner的选择事件 spinner1。setOnItemSelectedListener(new SpinnerOnSelectedListener1()); //关闭数据库 dbm。closeDatabase(); db.close(); String pcode = String。valueOf(cursor.getInt(0)+1); initSpinner2(pcode); } publicvoid initSpinner2(String pcode){ dbm = new DBManager(this); dbm.openDatabase(); db = dbm。getDatabase(); List<MyListItem〉 list = new ArrayList〈MyListItem〉(); String dstName=””; int idx=0; int found=0; { String sql = ”select name from citys where city_num=’”+areaCode+"’"; //查询指定城市的城市名 Cursor cursor = db.rawQuery(sql,null); cursor.moveToFirst(); byte bytes[]=cursor.getBlob(0); try { dstName = new String(bytes,"utf—8"); } catch (UnsupportedEncodingException e) { // TODO Auto—generated catch block e。printStackTrace(); } } pcode = String。valueOf(Integer。valueOf(pcode).intValue() - 1); try { String sql = ”select * from citys where province_id=’”+pcode+”’"; //查询表中指定省份所有城市的城市信息 Cursor cursor = db.rawQuery(sql,null); cursor。moveToFirst(); while (!cursor。isLast()){ String code=cursor.getString(cursor。getColumnIndex("_id”)); byte bytes[]=cursor。getBlob(2); String name=new String(bytes,"utf—8"); String city_num = cursor。getString(cursor。getColumnIndex("city_num”)); if(0==found) { if(!dstName。equals(name)) { idx += 1; } else { found=1; } } MyListItem myListItem=new MyListItem(); myListItem。setName(name); myListItem。setPcode(code); myListItem。setCityNum(city_num); list.add(myListItem); cursor。moveToNext(); } String code=cursor。getString(cursor.getColumnIndex("_id”)); byte bytes[]=cursor。getBlob(2); String name=new String(bytes,”utf—8”); String city_num = cursor。getString(cursor.getColumnIndex(”city_num”)); MyListItem myListItem=new MyListItem(); myListItem.setName(name); myListItem。setPcode(code); myListItem。setCityNum(city_num); list.add(myListItem); } catch (Exception e) { } MyAdapter myAdapter = new MyAdapter(this,list); spinner2。setAdapter(myAdapter); spinner2。setSelection(idx, true); spinner2.setOnItemSelectedListener(new SpinnerOnSelectedListener2()); dbm。closeDatabase(); db。close(); } class SpinnerOnSelectedListener1 implements OnItemSelectedListener{ publicvoid onItemSelected(AdapterView<?〉 adapterView, View view, int position, long id) { //获取spinner选择的item选项 String pcode =((MyListItem) adapterView.getItemAtPosition(position))。getPcode(); initSpinner2(pcode); } publicvoid onNothingSelected(AdapterView〈?〉 adapterView) { // TODO Auto—generated method stub } } class SpinnerOnSelectedListener2 implements OnItemSelectedListener{ publicvoid onItemSelected(AdapterView<?〉 adapterView, View view, int position, long id) { String city_num =((MyListItem) adapterView.getItemAtPosition(position)).getCityNum(); areaCode = city_num; } publicvoid onNothingSelected(AdapterView〈?〉 adapterView) { // TODO Auto-generated method stub } } //设置点击菜单键时的显示内容 @Override publicboolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present。 getMenuInflater()。inflate(R。menu.main, menu); returntrue; } //设置菜单选项选中时的事件监听 @Override publicboolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest。xml。 int id = item。getItemId(); if (id == R。id。action_settings) { String info=”作者:丁柏林\nE-MAIL:1183084407@qq。com"; new AlertDialog.Builder(MainActivity.this)。setTitle("关于”)。setMessage(info).setPositiveButton("确定”, null).show(); returntrue; } returnsuper。onOptionsItemSelected(item); } 获取天气后生成短信,以下代码实现了怎样发送短信的功能: publicclass SendSms { /* * 以下代码均为实现发送短信的代码 * */ SmsManager smsManager = SmsManager。getDefault(); publicboolean sendMessage(String phoneCode, String content,PendingIntent sentIntent) { if (content.length() 〉 70) { List〈String> weatherList = smsManager。divideMessage(content); for (String str : w展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




基于Android的天气预报短信系统的毕业设计说明书.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/3944441.html