1、核准通过,归档资料。未经允许,请勿外传!本科毕业论文(设计)题 目 基于 Android 平台的天气预报软件设计 学生姓名 lion 专业名称 指导教师 9JWKffwvG#tYM*JgSharedPreferences.Editor editor= preferences.edit();editor.putString(“primaryCity“, primaryCity);mit();首先用 getSharedPreferences 方法得到一个 SharedPreferences 对象,文件名为 weather,权限为 MODE_PRIVATE。获取 SharedPreferences
2、对象时有三种权限可以选择, MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE;MODE_PRIVATE表示创建的文件只能由调用的应用程序访问,即只能被本程序访问;MODE_WORLD_READABLE 表示创建的文件让所有其他应用程序有读权限;MODE_WORLD_WRITEABLE 表示创建的文件让所有其他应用程序有写权限。用getSharedPreferences 方法创建的文件,系统会自动保存到用户安装程序的/data/data/shaared_pref 文件夹下。然后用创建的 SharedPreferences 对象获取 Sha
3、redPreferences 的 Editor对象,再用 Editor 的 put 方法向 weather 文件中写入用户偏好设置,最后用Editor 的 commit 方法保存写入的用户偏好信息。(2)取出首要城市名称的代码:/*取出首要城市的名称* return 首要城市的名称,不存在则返回空串*/public String getPrimaryCity()SharedPreferences preferences = context.getSharedPreferences(“weather“, context.MODE_PRIVATE);return preferences.getSt
4、ring(“primaryCity“, “);读取用户偏好信息时要用与保存用户偏好信息时同样的参数获取SharedPreferences 对象,用 SharedPreferences 的对象调用 get 方法即可得到设置进去的用户偏好信息。4.2.2 FilesFiles 数据储存方式主要用来天气信息。本程序调用 webService 获取天气信息,该 webService 调用采用 soap2 协议,通过标准 xml 文件流交互信息,得到的天气预报信息为一个文件输入流对象,保存后为一个 xml 文件。由于天气预报信息实时性比较强,信息结构复杂;将 xml 文件解析处理后保存到数据库中可以以后
5、一次也用不上,所以本程序采用文件方式保存天气信息,Android系统中集成 pull 解析器,pull 解析器是一个功能强大并且使用方便的 xml 解析器。下面通过保存天气信息文件和读取天气文件介绍 Files 和 pull 解析器的用法。(1)保存天气信息/* 保存天气到xml文件中* param weatherInfo 天气情况的输入流对象* param cityName 城市名,这将用作文件名* throws IOException */public void saveWeatherInfo(InputStream weatherInfo,String cityName) throws
6、IOException FileOutputStream fos = context.openFileOutput(cityName,Context.MODE_PRIVATE);byte buffer = new byte1024;int len = 0;while(len = weatherInfo.read(buffer)!= -1)fos.write(buffer, 0, len);fos.close();Files 的方保存文件先用 Context 对象打开一个文件输出流,与用户偏好设置一样,我们可以设定这个文件的权限,在这里我就不再次说明,将获取到的输入流写到输出流中,关闭输出流天气
7、信息就保存成功了。(2)获取天气信息(包括解析天气信息)/*解析天气预报的xml文件* param cityName 需要解析城市的名称* return 天气情况* throws Exception*/public ArrayList parseWeatherXML(String cityName) throws ExceptionArrayList weatherInfos = new ArrayList();FileInputStream fis = context.openFileInput(cityName);XmlPullParser pullParser = Xml.newPull
8、Parser();pullParser.setInput(fis, “UTF-8“);int event = pullParser.getEventType();while(event != XmlPullParser.END_DOCUMENT)switch (event) case XmlPullParser.START_TAG:if(“string“.equals(pullParser.getName()/System.out.println(pullParser.nextText();weatherInfos.add(pullParser.nextText();break;event =
9、 pullParser.next();return weatherInfos;通过要查询的天气的城市名称获取到文件输入流,然后再同过 pull 解析器解析 xml 文件,得到天气信息字符串,用 ArrayList 保存并传出。以下是 webService 上得到的天气信息(3)孝感.xml湖北孝感5748257482.jpg2013-1-1 16:11:23-3/101月1日 多云无持续风向微风1.gif1.gif今日天气实况:气温:11;风向/风力:南风 2级;湿度:40%;空气质量:中;紫外线强度:最弱穿衣指数:暂缺。 过敏指数:天气条件极不易诱发过敏,可放心外出,享受生活。 运动指数:天
10、气较好,但考虑天气寒冷,推荐您进行室内运动,若在户外运动请注意保暖并做好准备活动。 洗车指数:较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。 晾晒指数:天气不错,午后温暖的阳光仍能满足你驱潮消霉杀菌的晾晒需求。 旅游指数:多云,有时云会遮挡住阳光,但丝毫不会影响您出行的心情。温度适宜又有微风相伴,很适宜旅游。路况指数:天气较好,路面比较干燥,路况较好。 舒适度指数:天气较好,早晚会感觉偏凉,午后舒适、宜人。 空气污染指数:气象条件对空气污染物稀释、扩散和清除无明显影响,易感人群应适当减少室外活动时间。 紫外线指数:属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SP
11、F在8-12之间的防晒护肤品。-1/31月2日 多云转阴北风3-4级1.gif2.gif-1/11月3日 阴转雨夹雪北风3-4级转无持续风向微风2.gif6.gif位于湖北省东北部,南临省会武汉市,北与河南、随州交界,西接天门、仙桃、京山等县市,东连黄冈市的红安县和武汉市的黄陂区。因东汉孝子董永行孝感天而得名。孝感市是改革开放中发展起来的新兴中等城市,辖孝南区、汉川市、应城市、安陆市和云梦县、大悟县、孝昌县;国土面积11560平方公里,总人口580万人。孝感是楚文化的重要发祥地之一。周代贰国、轸国、郧国都建都于此。秦代竹简、秦汉漆器、东汉陶楼等国宝文物和楚王城等遗址展示了孝感绚丽多财的古代文化
12、。剪纸、皮影、膏塑等传统文化艺术源源流长。孝感市属亚热带大陆性季风气候,四季分明,雨量充沛,温暖湿润,光照充足。全年主导风向为东南风,年均气温在15.5-16.5C之间。景观:大洪山、白水寺、白云泉、石刻题记、董永故里、鄂豫边区革命烈士陵园、高挂三潭、擂鼓墩古墓群。从上面天气信息 xml 文件看出,有用的天气信息都在标签中,我们用 pull 解析器不断解析,并保存 string 标签中的内容便可以得到天气信息。while(event != XmlPullParser.END_DOCUMENT)switch (event) case XmlPullParser.START_TAG:if(“str
13、ing“.equals(pullParser.getName()weatherInfos.add(pullParser.nextText();break;event = pullParser.next();4.3 主要功能代码本项目使用的代码较多,本部分对天气预报项目中核心代码进行解析,这部分代码能够完成天气预报的查询与显示的基本功能,另外一部分代码则实现的了能够与用户更好的交互,增加应用的界面美观的功能。4.3.1 获取天气数据从http:/ Service中获取的天气数据,数据的获取地址为:http:/ * param cityName 城市名* return 获取成功则返回true,否则
14、false* throws Exception*/public boolean queryWeather(String cityName) throws Exceptionfinal String WEATHER_CITY = “http:/ soap = readSoap();soap = soap.replaceAll(“$cityNameaa“, cityName);byte entity = soap.getBytes();String path = WEATHER_CITY;HttpURLConnection conn = (HttpURLConnection) new URL(pa
15、th).openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod(“POST“);conn.setDoOutput(true);conn.setRequestProperty(“Content-Type“, “application/soap+xml; charset=utf-8“);conn.setRequestProperty(“Content-Length“, String.valueOf(entity.length);conn.getOutputStream().write(entity);if(conn.g
16、etResponseCode() = 200)/保存天气信息到xml文件saveWeatherInfo(conn.getInputStream(),cityName);return true;return false;readSoap方法private static String readSoap() throws Exception InputStream inputStream = QueryWeatherService.class.getClassLoader().getResourceAsStream(“soap12.xml“);byte data = StreamTool.read(
17、inputStream);return new String(data);通过 readSoap 方法读取 src 下 soap12.xml 文件,得到访问天气预报的webService 的标准天气交互格式,查询天气时将 xml 中指定的城市名称换成实际要查询的天气预报的城市名,然后提交查询。然后获取到天气信息的输入流对象。4.3.2 网络检查public static boolean ckeck(Context context) ConnectivityManager con = (ConnectivityManager) context.getSystemService(Context.C
18、ONNECTIVITY_SERVICE);NetworkInfo networkinfo = con.getActiveNetworkInfo();if (networkinfo = null | !networkinfo.isConnected() / 当前网络不可用return false;return true;检查设备当前是否接入网络,使用此功能需要在 AndroidManifest.xml 中添加访访问权限:4.3.3 定时更新时间本程序一启动就会启动就会查看用户偏好设置中用户是否启用自动更新天气服务,若启用,程序会启动TimeService这个后台服务,按照用户设置进行天气信息更新
19、。核心代码如下:AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);alarmManager.set(AlarmManager.RTC_WAKEUP, now + updateMilis, pendingIntent);至此,后台服务介绍完毕,最后还需要在AndroidManifest.xml文件中注册后台服务。4.3.4 ViewFlipper 手势监听七彩天气主界面的Activity实现了OnGestureListener接口,下面onFling方法就是OnGestureList
20、ener中的一个方法,该方法实现了viewFlipper对滑动手势的监听,并完成滑动切换效果。onFling中两个MotionEvent参数分别是用户做滑动手势时,触屏的起点位置和终点位置,通过getX()方法取出触点的X轴坐标,计算终点X轴坐标与起点X轴坐标,差值大于100dp,则认为用户使用滑动手势,通过差值的正负来判断用户需要向左滑动还是向右滑动,如果差值为正则从左向右滑动,反之从右向左滑动。Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) if
21、(e2.getX() - e1.getX() 100) / 从左向右滑动(左进右出)if(myViewFlipper.isFlipping()/如果ViewFlipper正在滑动,则不划动到下一页,没有实现System.out.println(“myViewFlipper.isFlipping“);return true;Animation rInAnim = AnimationUtils.loadAnimation(WeatherActivity.this,R.anim.push_right_in); / 向右滑动左侧进入的渐变效果(alpha 0.1 - 1.0)Animation rOu
22、tAnim = AnimationUtils.loadAnimation(WeatherActivity.this,R.anim.push_right_out); / 向右滑动右侧滑出的渐变效果(alpha 1.0 - 0.1)myViewFlipper.setInAnimation(rInAnim);myViewFlipper.setOutAnimation(rOutAnim);myViewFlipper.showPrevious();return true; else if (e2.getX() - e1.getX() 1.0)Animation lOutAnim = AnimationU
23、tils.loadAnimation(WeatherActivity.this,R.anim.push_left_out); / 向左滑动右侧滑出的渐变效果(alpha 1.0 - 0.1)myViewFlipper.setInAnimation(lInAnim);myViewFlipper.setOutAnimation(lOutAnim);myViewFlipper.showNext();return true;return true;4.3.5 城市管理中城市点击事件城市管理中采用GridView以网格形式展现给用户9个城市管理区域,用户在这9个区域中可以自由添加或删除关注的城市。Gri
24、dViewItemClickListener中写了当GridView中某一个itme被点击时所做出想响应。当用户点击的位置对应了一个用户已经关注的城市(即触点在“+”前面),程序会先将本城市设定为首要城市,然后发送UI更新消息,更新城市天气界面,最后将界面焦点自动定位到城市天气页面;如果点击位置对应的是“+”,则弹出添加城市对话框;如果点击位置在“+”之后,程序不会响应这个事件。class GridViewItemClickListener implements OnItemClickListenerpublic void onItemClick(AdapterView arg0, View
25、arg1, int position,long arg3) System.out.println(“GridViewItemClickListener“);preferencesService = new PreferencesService(w_context);/得出当前已经设定的城市数目setCtiyNum = preferencesService.nowCityNum();/如果点击的位置小于当前设定城市的数目,跳转到position指定的城市天气界面if(position setCtiyNum)/添加代码,跳到城市天气那一页,并设定首要城市为选定的城市String selectCit
26、yName = preferencesService.getCityNameByCityNum(position+1);primaryCity = selectCityName;preferencesService.setPrimaryCity(selectCityName);isParseWeather = getWeatherFromXML();/尝试解析primaryCity天气情况if(!isParseWeather)/如果不存在天气文件,更新天气,更新天气完毕发送刷新消息refreshWeather(primaryCity);/解析成功,发送更新第一个界面Message msg = new Message();msg.what = 1;myHandler.sendMessage(msg);/跳到第一页myViewFlipper.setDisplayedChild(0);/如果点击的位置等于当前设定城市的数目,跳转到添加城市界面else if(position = setCtiyNum)AddCityDialog showDialog = new