基于Android平台的天气预报系统的设计与开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Android平台的天气预报系统的设计与开发
基于Android平台的天气预报系统的设计与开发
摘要:安卓是谷歌于2008年推出的一个智能手机操作系统,其独特的设计模式使得开发手机软件变得非常简单。
该论文介绍了一款安卓天气预报的设计与实现过程。
用户可以通过主界面选择城市来获得包括风力、风向、紫外线强度等的天气信息。
基于手机的天气预报系统能够使用户对于各地的天气情况实时掌握,方便用户的出行和行程安排,具有一定的实用性。
关键字:实时预报,Android,温度检测,定位
The Design and Development of Weather Forecast System based on the Android
Ⅰ
System
Abstract: Android is a Smartphone system launched by Google in 2008, whose unique design pattern makes it easier to develop mobile phone softwares . The paper introduces the process of the design and implementation of a Android weather forecast system. Users can choose a city what he likes from the home screen to get access to the weather
information ,including wind,wind
direction,strong of ultraviolet light and so
on.Weather forecast system based on mobile phone enables users to take the real-time control of weather conditions of all parts,thus bringing great convenience to the user's travel and travel arrangements, and has a certain practicality
Keywords: real-time forecast, Android , Temperature detection , location
毕业论文(设计)原创性声明
本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。
据我所知,除文中已经注明引用的内容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。
对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。
作者签名:日期:
毕业论文(设计)授权使用说明
本论文(设计)作者完全了解**学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。
有权将论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被查阅。
学校可以公布论文(设计)的全部或部分内容。
保密的论文(设计)在解密后适用本规定。
作者签名:指导教师签名:
日期:日期:
注意事项
1.设计(论文)的内容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他
人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
3)其它
目录
1.绪论 (1)
1.1系统开发的目的
1
1.2系统开发工具
1
1.3 项目需求分析 (1)
2.项目设计 (2)
2.1 系统架构图 (2)
2.2 webservice网络拓扑图 (2)
2.3 项目框架 (3)
3.Google Android平台的相关理论 (4)
3.1 Google Android移动平台下的应用研究 (4)
3.2 Android关键技术研究 (5)
4.天气预报程序设计 (6)
4.1 Android的UI界面的实现 (6)
4.2欢迎界面的实现 (8)
4.3 主界面功能实现 (9)
4.4数据存储 (29)
5.系统测试 (32)
5.1测试目的 (32)
5.3 测试内容和结果 (32)
5.4 测试结果 (35)
6.结束语 (35)
致谢 (36)
参考文献 (37)
1.绪论
1.1系统开发的目的
由于智能手机的快速普及,智能操作系统在手机市场占据了很大一部分,其中以Andriod和iOS最为流行。
为了让智能手机用户能够随时随地查询互联网所提供的信息,一种非常高效的方法就是将网络系统的功能扩展到智能手机终端上,让手机能够通过移动网络访问Web网站并处理各种各样的业务。
由于在大学学习过java语言,并且Andriod系统是基于java语言开发的,因此想开发一套基于Andriod平台的3G手机气象软件,并从网上获取天气预报信息。
Android 平台的天气预报软件的开发可以进一步扩大气象信息的覆盖面,让广大Android 手机用户能够在第一时间获取最新的天气预报信息,以便提前预防,方便出行。
同时,把气象灾害造成的损失降到最低,也可以提高公共服务质量,更好的发挥气象事业对经济社会发展的现实性作用,有巨大的实用价值。
虽然该技术在Android平台已经比较成熟,但是通过该软件的开发仍然能帮助我更好的认识Android系统的工作原理。
1.2系统开发工具
(1)win7系统jdk 1.8
(2)Eclipse标准版及ADT插件
(3) SensorSimulator(用来模拟安卓手机中的温度传感器)
1.3 项目需求分析
(1) 系统能够通过手机精确定位全国各个城市未来几天的天气情
况
(2) 系统具有安全性,独立性,可靠性
(3) 系统界面设计优美,符合用户的操作习惯,且在一定程度上节省流
量开销
2.项目设计
2.1 系统架构图
图2.1 系统构架图
2.2 webservice网络拓扑图
本系统是基于提供webservice服务的网站接收数据,然后对数据进行解析,从中找到需要的数据。
如图2.2所示为提供webservice服务的网站网络拓扑图
图 2.2 网络拓扑图
2.3 项目框架
图2.3 工程目录
其中GPSActivity用来处理GPS定位信息,WeatherWebServiceActivity为天气预报主界面类,WebServiceUtil用来处理从网站中接收的数据,ConverUtil为处
理经纬度转换的类,LoginActivity是处理登录界面的类。
3.Google Android平台的相关理论
3.1 Google Android移动平台下的应用研究
Android系统提供给应用程序开发者的只是一个框架,在该平台下开发应用程序必须要遵守这个框架原则。
我们开发的应用程序其实就是在这个框架上进行拓展,下面介绍一下android这个框架所提供的功能。
Android.app:提供最上层的程序模型和运行环境
Android.content:包含对设备上的数据进行访问和发布的类
Android.database:Android系统内置一个轻量级的SQLite数据库
Android.graphics:底层的图形库,包含颜色过滤,画布,矩形,点,可以用来将它们直接绘制到屏幕上。
: 提供用来帮助访问网络的类。
Android.location:定位以及与定位有关的一些类。
Android.util:涉及到一些实用性的方法,例如对时间和日期进行操作。
Android.media: 提供一些管理多种视频,音频的媒体接口。
Android.os:提供了系统服务,IPC机制和消息传输。
Android.opngl:提供了OpenGL的工具。
Android.provider:提供了访问Android中的内容提供者的类。
Android.telephony:提供用来与拨打电话相关的API交互的类。
Android.view: 提供最基本的用户界面接口框架。
Addroid.webkit:提供用来调用默认浏览器的接口。
Android.widget包含各种UI元素,可以在应用程序的布局中使用。
3.2 Android关键技术研究
Android平台是基于java语言开发的,其中主要由四大组建构成,分别为:Activity、Service、Broadcast Receiver、Content Provider。
1.Activity Activity就是一个用户界面,每一个Activity就是一个独立的界面。
比如照相机程序,实现一个拍照的Activity,短信也是一个Activity,拨号界面也是一个Activity等等,这些Activity都是相互独立的,但组合在一起它们就变成一个完整功能的应用程序了。
我们可以把Activity理解成java中的JFrame控件,不过它与JFrame的区别在于:java中的JFrame本身可以设置布局管理器,不断的向JFrame中添加组件,但Activity只能通过setContentView(layout)方法在主界面显示布局。
2.Service Service与Activity的地位是相同的,它也代表一个独立的Android组件,Service与Activity的区别在于:Service通常在后台运行,它不需要与用户进行交互,因此Service没有用户界面。
与Activity需要继承Activity 的基类一样,Service同样也需要继承Service基类。
当一个Service组件在后台运行起来后,它就会和Acitivity同样也有自己的生命周期。
Service组件通常用于为一些不需要界面但是又必须在后台运行的程序提供服务,比如音乐或者音频播放软件。
3. Broadcast Receiver中文意思是广播接收者,顾名思义它主要就是用来接收来自广播和系统中的应用程序发送的消息。
在Android中广播的用处非常广泛,例如当开机后会自动产生一条广播,接收到这条广播后系统就能及时的做出提示和保存数据等操作;当电池电量低的时候系统也会产生一条广播,这样就能
及时提示用户进行充电等的操作。
本质上Broadcast Receiver就是一种全局的监听器,我们用它来监听系统向应用程序发送的广播消息。
基于以上所述我们可以用它非常方便的实现系统中不同组件之间的相互通信。
4.Content Provider 它是不同APP之间进行交换数据的核心的API ,Content Provider在系统中以某种URI的形式对外提供数据,允许其他应用查询或者修改数据;其他应用程序使用Content Resolver根据URI去访问和操作指定的数据。
事实上这里有一个简单的类比:可以把Content Provider看作安卓系统内部提供的一个网站,这个网站以固定的URI对外提供服务;而Content Resolver可以当成系统内部的HttpClient,它可以向指定的URI发送请求,这种请求最后委托给Content Provider处理,从而实现对网站内部数据进行操作。
3.3 小结
本单元主要概括了关于Android平台的三个方面的内容:1.Google android 移动平台的概述2.google android移动平台开发过程的研究3.Google android移动平台下的应用研究,概要的介绍了Google android移动平台相关知识,4.介绍了Android平台下的四大组件的相关内容。
通过本章我们对Google android移动平台有初步的认识和了解,为后面的开发做了坚实的基础。
4.天气预报程序设计
4.1 Android的UI界面的实现
在Android中用户界面都是布局在XML文件中的。
这些XML文件放在工程/res/layout下面。
这对以前熟悉java可视化编程的人来说可能有些不太习惯。
可能有人疑问为什么要把布局文件放在XML文件里呢?其实有过web基础的都
应该知道mvc框架,这是一种用于网站开发的非常优秀的思想,在安卓系统中,安卓开发人员把用户界面放在XML文档中定义,这样就可以让XML文档专门负责用户UI界面设置,而java程序专门负责业务实现,从而降低程序的耦合,便于程序的维护和扩展,符合mvc设计思想。
在XML中Android开发人员放置了很多我们经常用到的一些组件,比如view,Button,EditText等,通过这些系统提供的控件,我们可以开发出我们想要的程序界面来。
Layout是一类特殊的ViewGroup 控件,它们本身并不显示任何的内容,存在的惟一原因就是其中的内部结构,能够更好地摆放它的子控件。
比如Linearlayout(线性布局),可将子控件按水平或垂直方向按顺序排列下去;Tablelayout(表格布局),可以将子控件按照表格的形式,一枚枚放置好;Relativelayout(相对布局),实际应用中这个布局更灵活,它可以设定各个控件之间的对齐和排列关系,适合编写复杂的界面。
有了Layout的存在,控件和控件之间不再是独立地存在,而是更有机地结合在一起,设定起来也更为方便。
在本程序中布局文件我一共用到了如图4.1所示的布局文件
图4.1 布局文件图
其中city_detail用来显示城市简介的信息,city_environment用来显示当前所在
城市的生活指数信息,city_layout用来显示用来选择城市布局,content_layout用来显示天气情况,gps_view用来显示gps定位信息,login用来显示登录欢迎界面,main包含了用来切换的三个界面,tqyb显示主界面布局
4.2欢迎界面的实现
考虑到程序界面的美观效果,在进入主界面之前我首先设置了一个用来跳转的Activity,并命名为LoginActivity。
在LoginActivity中显示login布局Timer timer = new Timer();
final Intent intent = new
Intent(this,edu.njue.app.WeatherWebServic eActivity.class);
TimerTask task = new TimerTask(){
@Override
public void run() {
startActivity(intent);
LoginActivity.this.finish();
}
};
timer.schedule(task, 1000);
}
程序显示画面一秒后会进入主程序天气界面,如图4.2所示程序欢迎界面
图4.2 欢迎界面图
4.3 主界面功能实现
第一次安装好进入程序界面时,系统会显示“本程序是第一次运行,请选择想要了解的城市”的窗口。
在这里我把默认城市设置为南京,如果用户不单击城市选择按钮的时候,则会显示的是南京近两天的天气情况。
如图4.3所示。
第一次运行时,我是通过在手机文件系统中判断是否存在一个名为shared_prefs的文件来判断是否为第一次运行,如果存在则不是第一次运行,系统会继续执行向下执行代码,如果系统中不存在该文件,则为第一次运行该程序,程序弹出对话框告诉用户。
图4.3 第一次运行效果图
在主程序界面,我运用的主要是ViewFlipper组件,通过该组件可以实现滑动显示界面,不过在设置滑动界面之前我们要先设定滑动的动画。
该动画实在res\anim中设置,如图4.4所示为左右滑动效果布局
图4.4 界面滑动布局
其中left_in中的代码为:
<set xmlns:android="/apk/res/android">
<translate android:fromXDelta="100%p"android:toXDelta="0"
android:duration="500"/>
<alpha android:fromAlpha="0.1"android:toAlpha="1.0"
android:duration="500"/>
</set>
其他四个与此基本相似,在此不再列出。
当我们定义了滑动效果之后还要在main.xml中把想要滑动的布局包含进去。
<ViewFlipper android:id="@+id/viewFlipper"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/tqyb"/>
<include
android:id="@+id/city_envrionment"
layout="@layout/city_environment"/>
<include android:id="@+id/city_detail"
layout="@layout/city_detail"/>
</ViewFlipper>"
有了这个布局之后我们就可以在主程序界面调用界面进行切换了。
主程序实现触屏监听接口,监听触摸时的x,y坐标,以及当手指离开时的坐标,如果两者之间的距离大于或小于100像素,则认为想要实现滑动。
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_ DOWN){
touchDownX = event.getX();
return true;
}else
if(event.getAction()==MotionEvent.ACTION_U P){
touchUpX = event.getX();
if(touchUpX-touchDownX>100){//从左往右滑动
viewFlipper.setAnimation(AnimationUtils.loa dAnimation(this,android.R.anim.slide_in_left));
viewFlipper.setAnimation(AnimationUtils.loa dAnimation(this,android.R.anim.slide_out_right) );
viewFlipper.showPrevious();
}else if(touchDownX-touchUpX>100){
viewFlipper.setAnimation(AnimationUtils.loa dAnimation(this, R.anim.right_in));
viewFlipper.setAnimation(AnimationUtils.loa dAnimation(this,R.anim.left_out));
viewFlipper.showNext();
}
return true;
}
return false;
}
获取天气信息并显示
天气预报系统最重要的当然是如何才能有效的获取天气信息了,要想获取实时的天气信息,我们就要访问专门提供天气信息的网站把网站返回的信息解析出想要的信息并显示在手机上。
通过网上的搜索,我找到了一个提供webservice 的网站:/webservices/weatherwebservice.asmx 通过向这个网站提供参数就可以获取指定城市的天气信息了,该网站是从中央气象台接收的信息,数据准确可靠。
每隔两个小时更新一次天气情况,具有很好的实时性。
Webservice的出现成功的解决了不同平台和语言之间进行数据交换的问题,它主要使用XML文档来传递消息,并将该消息发送给任何请求对象,由于不同系统对XML的完美支持,因此从根本上完善了跨平台服务,任何时刻、任何平台我们可以使用任何语言来访问该Webservice服务。
对于Webservice使用者而言,webservice API与任何操作平台无关,它只是以XML语言作为数据交换格式。
Webservice平台主要涉及到的技术是SOAP(Simple Object Access Protocol),WSDL(Web Service Description Language)
SOAP依赖于XML文档来构建,一条SOAP消息就是一份特定的XML文
档,SOAP主要包含三个方面的主要元素:
(1)<Envelope…/>根元素,该元素是必填的。
其中SOAP消息用来传递的
数据的XML文档以该元素作为根元素
(2)<Header…/>元素,该元素是选填的。
它包含了SOAP消息的头信息
(3)<Body…/>元素,该元素是必填的。
它包含所有的调用和相应的内容
Java本身提供了很丰富的Web Service支持,比如Sun公司制定的JAX-WS 2规范,Apache开源组织提供的Axis1,Axis2,CXF等。
我们可以使用Google公司为Android平台开发的专门处理Webservice信息的ksoap2-android进行客户端的开发。
使用该第三方包的方法为:
1.创建HttpTrasportSE对象
2.创建SoapSerializationEnvelope对象
3.创建SoapObject对象,创建该对象时需要传入所要调用Web Service的命名空间
4.如果有参数需要传给WebService服务器端,调用SoapObject对象的addProperty(String name,Object value)方法来设置参数,该方法的name参数指定参数名,value指定参数值
5.调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyout属性赋值,将前两步创建的SoapObject对象设SoapSerializationEnvelope的传出SOAP消息体
6.调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程的WebService
7.调用完成后,访问SoapSerializationEnvelope对象的bodyin属性,该属性
返回一个SoapObject对象,该对象就代表了Web Service的返回消息,解析该SoapObject对象,即可获取调用Web Service的返回值。
基于此编写调用webservice服务的类WebServiceUtil
返回城市列表
public static List<String> getProvinceList() {
// 需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息) //String methodName = "getRegionProvince";
String methodName = "getSupportProvince";
// 创建HttpTransportSE传输对象
HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL);
httpTranstation.debug = true;
// 使用SOAP1.1协议创建Envelop对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 实例化SoapObject对象
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
envelope.bodyOut = soapObject;
// 设置与.Net提供的Web Service保持较好的兼容性
envelope.dotNet = true;
try
{
// 调用Web Service
httpTranstation.call(SERVICE_NS + methodName, envelope);
if (envelope.getResponse() != null)
{
// 获取服务器响应返回的SOAP消息
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(methodName
+ "Result");
// 解析服务器响应的SOAP消息。
return parseProvinceOrCity(detail);
}
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
解析出省份和城市,把返回的数据用split方法切割,只取需要的省份数据private static List<String> parseProvinceOrCity(SoapObject detail)
{
ArrayList<String> result = new
ArrayList<String>();
for (int i = 0; i < detail.getPropertyCount(); i++)
{
String str =
detail.getProperty(i).toString();
// 解析出每个省份
result.add(str.split(" ")[0]);
}
return result;
}
通过具体的城市获取天气信息
public static SoapObject
getWeatherByCity(String cityName)
{
// 根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数//String methodName = "getWeather";
String methodName = "getWeatherbyCityName";
HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL);
httpTranstation.debug = true;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER1 1);
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
//soapObject.addProperty("theCityCode", cityName);
soapObject.addProperty("theCityName",city Name);
envelope.bodyOut = soapObject;
envelope.dotNet = true;
try
{
// 调用Web Service
httpTranstation.call(SERVICE_NS + methodName, envelope);
if (envelope.getResponse() != null)
{
// 获取服务器响应返回的SOAP消息
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(methodName+ "Result");
// 解析服务器响应的SOAP消息。
return detail;
}
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
如图4.5所示为调用此方法后返回的为XML文档
图4.5 网站返回XML文档
接下来我们只需要对该文件解析就可以拿出我们需要的数据了。
然后把对应的数据添加在相应的地方即可。
城市列表的选择:
当我们单击城市选择按钮的时候会跳出图4.6的城市选择界面
图4.6 城市选择界面对应的方法为
public void show_dialog(int cityId)
{
city_text =
(TextView)findViewById(R.id.city_text);
switch (cityId)
{
case CITY:
// 取得city_layout.xml中的视图
final View view = LayoutInflater.from(this).inflate(
yout.city_layout, null);
// 省份Spinner
province_spinner = (Spinner)
view.findViewById(R.id.province_spinner);
// 城市Spinner
city_spinner = (Spinner)
view.findViewById(R.id.city_spinner);
provinces =
WebServiceUtil.getProvinceList();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,yout.si mple_spinner_item, provinces);
adapter.setDropDownViewResource(android. yout.simple_spinner_dropdown_item);
province_spinner.setAdapter(adapter);
// 省份Spinner监听器
province_spinner.setOnItemSelectedListener( new OnItemSelectedListener()
{
@Override
public void
onItemSelected(AdapterView<?> view,
View parent, int position, long id)
{
citys =
WebServiceUtil.getCityListByProvince(provinces .get(position));
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(WeatherWebServiceAct ivity.this,
yout.simple_spinner_item, citys);
adapter1.setDropDownViewResource(androi yout.simple_spinner_dropdown_item);
city_spinner.setAdapter(adapter1);
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{
}
});
// 城市Spinner监听器
city_spinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void
onItemSelected(AdapterView<?> arg0, View arg1,
int position, long arg3)
{
city_str = citys.get(position);
}
@Override
public void
onNothingSelected(AdapterView<?> arg0)
{
}
});
// 选择城市对话框
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("请选择所属城市");
dialog.setView(view);
dialog.setPositiveButton("确定",new DialogInterface.OnClickListener()
{
@Override
public void
onClick(DialogInterface dialog, int which)
{
city_text.setText(city_str);
writeSharedPreference(city_str);
refresh(city_str);
checkWeather(city_str);
}
});
dialog.setNegativeButton("取消",new DialogInterface.OnClickListener()
{
@Override
public void
onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
dialog.show();
break;
default:
break;
}
}
编写gps定位转换类用于定位当前位置信息ConverUti l。
由于Google SDK内部的一个小bug,我们不能直接利用手机内部来定位地址,必须要把当前的经纬度信息发送给谷歌网站来解析。
public static String getAddress(double longitude,double latitude){
//
HttpClient client = new DefaultHttpClient();
//Get方法得到内容
HttpGet httpGet = new
HttpGet("/maps/api/"
+ "geocode/json?latlng="
+ latitude + "," + longitude
+ "&sensor=false®ion=cn");
StringBuilder sb = new StringBuilder();
try{
HttpResponse response =
client.execute(httpGet);
HttpEntity entity = response.getEntity();
//获取服务器响应的字符串
InputStream is = entity.getContent();
int b;
while((b = is.read())!=-1){
sb.append((char)b);
}
//把服务器相应的字符串转化为JSon对象
JSONObject jsonObj = new JSONObject(sb.toString());
//解析出相应结果中的地址信息
String s1 =
jsonObj.getJSONArray("results").getJSONObj ect(0).getString("formatted_address");
String s2 = s1.split(",")[3];
Log.i("start", s2);
return
jsonObj.getJSONArray("results").getJSONObj ect(0).getString("formatted_address");
}catch(Exception e){
e.printStackTrace();
}
return null;
}
本软件同样实现了传感器接口,可以实时监测当前外部温度,增加用户的友好体验,主要方法为:
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float[] values = event.values;
//真机上获取触发event的传感器类型
//int sensorType = event.sensor.getType();
//模拟器上获取触发event的传感器类型
int sensorType = event.type;
StringBuilder sb = null;
switch(sensorType){
case Sensor.TYPE_TEMPERATURE:
sb = new StringBuilder();
sb.append(values[0]);
sb.append("℃");
et.setText(sb.toString());
break;
default:break;
}
}
4.4数据存储
有时候应用程序需要有数据保存,而且这些数据都比较简单,基本上只是一些简单的字符串,标量类型的值等。
对于这种数据,Android提供了SharedPreferences进行保存。
SharedPreferences主要保存的是一些简单的
key-value对。
在本程序中,我首先设置了一个判断网络状态连通情况的方法,
返回一个Boolean类型的值,如果网络正常连接,则会从网络刷新天气,如果当前网络状态不好,则会从本地保存的XML文件中读取缓存的天气,方便用户进行查看。
判断网络状态的方法:
/ /判断网络类型是否为3G网络
public boolean isNetwork(){
ConnectivityManager connectivityManager =
(ConnectivityManager)this.getSystemService(C ontext.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo!=null){
return networkInfo.isAvailable();
}
return false;
}
//判断是否为WIFI连接
public boolean isWIFINetwork(){
ConnectivityManager connectivityManager =
(ConnectivityManager)this.getSystemService(C ontext.CONNECTIVITY_SERVICE);
if(connectivityManager == null){
return false;
}else{
NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
if(info!=null){
for(int i=0;i<info.length;i++){
if(info[i].getTypeName().equals("WIFI")&&i nfo[i].isConnected()){
return true;
}
}
}
}
return false;
}
在oncreate方法中,首先判断当前连接情况if(isNetWork()||isWIFINetwork())如果判断为真,则会从网站更新天气,如果不为真则会从SharedPreferences保存的数据中读取显示。
5.系统测试
5.1测试目的
(1)确认软件的质量,确保软件能正常运行,并且达到了期待中的效果
(2)确认信息的正确性。
确保从网上下载的天气情况与实际的天气情况没有
什么差别
5.3 测试内容和结果
(1) 利用SensorSimulator进行测试,如图5.1,5.2所示,当前设置温度为25度
图5.1 SensorSimulator模拟传
递数据
此时手机显示温度为25度,与模拟器上的一样,证明该模块真实有效。
图5.2 手机显示实时温度
(2)GPS定位模块
通过在网上查询南京的经纬度信息为:东经:118°46'北纬:32°03',我们
把此经纬度信息发送给手机然后看手机显示的信息,如图5.3,5.4所示
图5.3 模拟经纬度图5.4
GPS定位效果图
(3)天气预报模块测试
如图5.5 图5.6所示为本程序所显示的天气信息,主要位置显示的是今天的天气状况,下面显示的分别是今明两天的天气情况,然后通过与中央气象台天气预报信息对比可以发现图5.7,两者基本无太大差别。
通过天气信息,我们可以发现所给生活指数也基本是符合本身认知的。
图5.5 主界面效果图图5.6 天气指数界面
图5.7 中央气象台实时天气
5.4 测试结果
通过以上测试可以发现,系统对天气预报能实现较好。
6.结束语
在我看来,Android平台是非常具有发展前景的。
其独特的设计模式以及基于java平台的开发语言都使得进入Android的门槛变得非常的低。
由于其极大的开放性和兼容性,同时也深为手机厂商的喜爱。
本文主要介绍了一款基于Android平台的天气预报软件的设计与实现过程,提出了Android用户界面设计、获取并解析城市列表数据的一种方法,给出了在用户界面上呈现数据的原理与设计过程,最后通过模拟器进行了应用程序的调试。
当然,基于Android平台的开发技术还需要进一步完善,需要在日后的工作中不断探索、研究,以建立实用的城市天气实况预报系统。
由于此作品是作为毕业设计的创作成果,其中软件的功能等方面并非处于一个成熟的阶段,当中的缺点是无可非议地存在着。
总之,这次设计从软件编写、调试到确定,我倾注了大量的时间和心血。
也曾经为寻找各种错误而烦恼过,也曾经为解决某一个问题而开心过,虽然过程很艰苦,但是结果总是好的。
因为我不仅品味到了结果的喜悦,更明白了过程的弥足珍贵。
致谢
经过几周的坚持不懈的努力,我的毕业设计终于完成了,原本以为毕业设计只是一分对过去四年所学的知识的简单运用,但是经过这次毕业设计,我明白自己的想法过于片面。
毕业设计不仅仅是对所学知识的运用,而且是对自己实践能力的一种考验。
我现在才深深体会到活到老,学到老的意义,学习是一个永无止境的过程,我还需要在今后的工作、生活中不断的学习,不断的积累经验,不断的提高自己的综合实力。
在此特别感谢我的指导老师程教授,程老师在我毕业设计选题、设计以及论文的撰写和修改过程中为我指点迷津,使我开拓了思路,程老师一丝不苟的作风,严谨务实的态度一直深深的影响着我,他脚踏实地的精神也不断激励着我,在此,谨向程老师致以最真诚的谢意。