基于Android平台的天气预报毕业论文.docx
《基于Android平台的天气预报毕业论文.docx》由会员分享,可在线阅读,更多相关《基于Android平台的天气预报毕业论文.docx(32页珍藏版)》请在冰豆网上搜索。
![基于Android平台的天气预报毕业论文.docx](https://file1.bdocx.com/fileroot1/2023-6/3/48539b20-0ceb-47be-8664-a158cd3965be/48539b20-0ceb-47be-8664-a158cd3965be1.gif)
基于Android平台的天气预报毕业论文
基于Android平台的天气预报毕业论文
基于Android平台的天气预报系统的设计与开发
摘要:
安卓是谷歌于2008年推出的一个智能手机操作系统,其独特的设计模式使得开发手机软件变得非常简单。
该论文介绍了一款安卓天气预报的设计与实现过程。
用户可以通过主界面选择城市来获得包括风力、风向、紫外线强度等的天气信息。
基于手机的天气预报系统能够使用户对于各地的天气情况实时掌握,方便用户的出行和行程安排,具有一定的实用性。
关键字:
实时预报,Android,温度检测,定位
TheDesignandDevelopmentofWeatherForecastSystembasedontheAndroidSystem
Abstract:
AndroidisaSmartphonesystemlaunchedbyGooglein2008,whoseuniquedesignpatternmakesiteasiertodevelopmobilephonesoftwares.ThepaperintroducestheprocessofthedesignandimplementationofaAndroidweatherforecastsystem.Userscanchooseacitywhathelikesfromthehomescreentogetaccesstotheweatherinformation,includingwind,winddirection,strongofultravioletlightandsoon.Weatherforecastsystembasedonmobilephoneenablesuserstotakethereal-timecontrolofweatherconditionsofallparts,thusbringinggreatconveniencetotheuser'stravelandtravelarrangements,andhasacertainpracticality
Keywords:
real-timeforecast,Android,Temperaturedetection,location
图2.2网络拓扑图
2.3项目框架
图2.3工程目录
其中GPSActivity用来处理GPS定位信息,WeatherWebServiceActivity为天气预报主界面类,WebServiceUtil用来处理从网站中接收的数据,ConverUtil为处理经纬度转换的类,LoginActivity是处理登录界面的类。
3.GoogleAndroid平台的相关理论
3.1GoogleAndroid移动平台下的应用研究
Android系统提供给应用程序开发者的只是一个框架,在该平台下开发应用程序必须要遵守这个框架原则。
我们开发的应用程序其实就是在这个框架上进行拓展,下面介绍一下android这个框架所提供的功能。
Android.app:
提供最上层的程序模型和运行环境
Android.content:
包含对设备上的数据进行访问和发布的类
Android.database:
Android系统内置一个轻量级的SQLite数据库
Android.graphics:
底层的图形库,包含颜色过滤,画布,矩形,点,可以用来将它们直接绘制到屏幕上。
A:
提供用来帮助访问网络的类。
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.2Android关键技术研究
Android平台是基于java语言开发的,其中主要由四大组建构成,分别为:
Activity、Service、BroadcastReceiver、ContentProvider。
1.ActivityActivity就是一个用户界面,每一个Activity就是一个独立的界面。
比如照相机程序,实现一个拍照的Activity,短信也是一个Activity,拨号界面也是一个Activity等等,这些Activity都是相互独立的,但组合在一起它们就变成一个完整功能的应用程序了。
我们可以把Activity理解成java中的JFrame控件,不过它与JFrame的区别在于:
java中的JFrame本身可以设置布局管理器,不断的向JFrame中添加组件,但Activity只能通过setContentView(layout)方法在主界面显示布局。
2.ServiceService与Activity的地位是相同的,它也代表一个独立的Android组件,Service与Activity的区别在于:
Service通常在后台运行,它不需要与用户进行交互,因此Service没有用户界面。
与Activity需要继承Activity的基类一样,Service同样也需要继承Service基类。
当一个Service组件在后台运行起来后,它就会和Acitivity同样也有自己的生命周期。
Service组件通常用于为一些不需要界面但是又必须在后台运行的程序提供服务,比如音乐或者音频播放软件。
3.BroadcastReceiver中文意思是广播接收者,顾名思义它主要就是用来接收来自广播和系统中的应用程序发送的消息。
在Android中广播的用处非常广泛,例如当开机后会自动产生一条广播,接收到这条广播后系统就能及时的做出提示和保存数据等操作;当电池电量低的时候系统也会产生一条广播,这样就能及时提示用户进行充电等的操作。
本质上BroadcastReceiver就是一种全局的监听器,我们用它来监听系统向应用程序发送的广播消息。
基于以上所述我们可以用它非常方便的实现系统中不同组件之间的相互通信。
4.ContentProvider它是不同APP之间进行交换数据的核心的API,ContentProvider在系统中以某种URI的形式对外提供数据,允许其他应用查询或者修改数据;其他应用程序使用ContentResolver根据URI去访问和操作指定的数据。
事实上这里有一个简单的类比:
可以把ContentProvider看作安卓系统内部提供的一个网站,这个网站以固定的URI对外提供服务;而ContentResolver可以当成系统内部的HttpClient,它可以向指定的URI发送请求,这种请求最后委托给ContentProvider处理,从而实现对网站内部数据进行操作。
3.3小结
本单元主要概括了关于Android平台的三个方面的内容:
1.Googleandroid移动平台的概述2.googleandroid移动平台开发过程的研究3.Googleandroid移动平台下的应用研究,概要的介绍了Googleandroid移动平台相关知识,4.介绍了Android平台下的四大组件的相关内容。
通过本章我们对Googleandroid移动平台有初步的认识和了解,为后面的开发做了坚实的基础。
4.天气预报程序设计
4.1Android的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布局
Timertimer=newTimer();
finalIntentintent=newIntent(this,edu.njue.app.WeatherWebServiceActivity.class);
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
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中的代码为:
android="
fromXDelta="100%p"android:
toXDelta="0"
android:
duration="500"/>
fromAlpha="0.1"android:
toAlpha="1.0"
android:
duration="500"/>
其他四个与此基本相似,在此不再列出。
当我们定义了滑动效果之后还要在main.xml中把想要滑动的布局包含进去。
id="@+id/viewFlipper"
android:
layout_width="match_parent"
android:
layout_height="match_parent">
android:
id="@+id/city_envrionment"
layout="@layout/city_environment"/>
id="@+id/city_detail"
layout="@layout/city_detail"/>
"
有了这个布局之后我们就可以在主程序界面调用界面进行切换了。
主程序实现触屏监听接口,监听触摸时的x,y坐标,以及当手指离开时的坐标,如果两者之间的距离大于或小于100像素,则认为想要实现滑动。
publicbooleanonTouch(Viewv,MotionEventevent){
if(event.getAction()==MotionEvent.ACTION_DOWN){
touchDownX=event.getX();
returntrue;
}elseif(event.getAction()==MotionEvent.ACTION_UP){
touchUpX=event.getX();
if(touchUpX-touchDownX>100){//从左往右滑动
viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_in_left));
viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_out_right));
viewFlipper.showPrevious();
}elseif(touchDownX-touchUpX>100){
viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,R.anim.right_in));
viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,R.anim.left_out));
viewFlipper.showNext();
}
returntrue;
}
returnfalse;
}
获取天气信息并显示
天气预报系统最重要的当然是如何才能有效的获取天气信息了,要想获取实时的天气信息,我们就要访问专门提供天气信息的网站把网站返回的信息解析出想要的信息并显示在手机上。
通过网上的搜索,我找到了一个提供webservice的网站:
通过向这个网站提供参数就可以获取指定城市的天气信息了,该网站是从中央气象台接收的信息,数据准确可靠。
每隔两个小时更新一次天气情况,具有很好的实时性。
Webservice的出现成功的解决了不同平台和语言之间进行数据交换的问题,它主要使用XML文档来传递消息,并将该消息发送给任何请求对象,由于不同系统对XML的完美支持,因此从根本上完善了跨平台服务,任何时刻、任何平台我们可以使用任何语言来访问该Webservice服务。
对于Webservice使用者而言,webserviceAPI与任何操作平台无关,它只是以XML语言作为数据交换格式。
Webservice平台主要涉及到的技术是SOAP(SimpleObjectAccessProtocol),WSDL(WebServiceDescriptionLanguage)
SOAP依赖于XML文档来构建,一条SOAP消息就是一份特定的XML文档,SOAP主要包含三个方面的主要元素:
(1)根元素,该元素是必填的。
其中SOAP消息用来传递的数据的XML文档以该元素作为根元素
(2)元素,该元素是选填的。
它包含了SOAP消息的头信息
(3)
元素,该元素是必填的。
它包含所有的调用和相应的内容
Java本身提供了很丰富的WebService支持,比如Sun公司制定的JAX-WS2规范,Apache开源组织提供的Axis1,Axis2,CXF等。
我们可以使用Google公司为Android平台开发的专门处理Webservice信息的ksoap2-android进行客户端的开发。
使用该第三方包的方法为:
1.创建HttpTrasportSE对象
2.创建SoapSerializationEnvelope对象
3.创建SoapObject对象,创建该对象时需要传入所要调用WebService的命名空间
4.如果有参数需要传给WebService服务器端,调用SoapObject对象的addProperty(Stringname,Objectvalue)方法来设置参数,该方法的name参数指定参数名,value指定参数值
5.调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyout属性赋值,将前两步创建的SoapObject对象设SoapSerializationEnvelope的传出SOAP消息体
6.调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程的WebService
7.调用完成后,访问SoapSerializationEnvelope对象的bodyin属性,该属性返回一个SoapObject对象,该对象就代表了WebService的返回消息,解析该SoapObject对象,即可获取调用WebService的返回值。
基于此编写调用webservice服务的类WebServiceUtil
返回城市列表
publicstaticListgetProvinceList()
{
//需要调用的方法名(获得本天气预报WebServices支持的洲、国内外省份和城市信息)
//StringmethodName="getRegionProvince";
StringmethodName="getSupportProvince";
//创建HttpTransportSE传输对象
HttpTransportSEhttpTranstation=newHttpTransportSE(SERVICE_URL);
httpTranstation.debug=true;
//使用SOAP1.1协议创建Envelop对象
SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope(
SoapEnvelope.VER11);
//实例化SoapObject对象
SoapObjectsoapObject=newSoapObject(SERVICE_NS,methodName);
envelope.bodyOut=soapObject;
//设置与.Net提供的WebService保持较好的兼容性
envelope.dotNet=true;
try
{
//调用WebService
httpTranstation.call(SERVICE_NS+methodName,envelope);
if(envelope.getResponse()!
=null)
{
//获取服务器响应返回的SOAP消息
SoapObjectresult=(SoapObject)envelope.bodyIn;
SoapObjectdetail=(SoapObject)result.getProperty(methodName
+"Result");
//解析服务器响应的SOAP消息。
returnparseProvinceOrCity(detail);
}
}catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
解析出省份和城市,把返回的数据用split方法切割,只取需要的省份数据
privatestaticListparseProvinceOrCity(SoapObjectdetail)
{
ArrayListresult=newArrayList();
for(inti=0;i{
Stringstr=detail.getProperty(i).toString();
//解析出每个省份
result.add(str.split("")[0]);
}
returnresult;
}
通过具体的城市获取天气信息
publicstaticSoapObjectgetWeatherByCity(StringcityName)
{
//根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数
//StringmethodName="getWeather";
StringmethodName="getWeatherbyCityName";
HttpTransportSEhttpTranstation=newHttpTransportSE(SERVICE_URL);
httpTranstation.debug=true;
SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope(Soap