安卓天气预报报告.docx
- 文档编号:23867774
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:17
- 大小:23.73KB
安卓天气预报报告.docx
《安卓天气预报报告.docx》由会员分享,可在线阅读,更多相关《安卓天气预报报告.docx(17页珍藏版)》请在冰豆网上搜索。
安卓天气预报报告
基于Android平台的天气预报系统的设计与开发
1.前言
1.1系统开发的目的
由于智能手机的快速普及,智能操作系统在手机市场占据了很大一部分,其中以Andriod和iOS最为流行。
为了让智能手机用户能够随时随地查询互联网所提供的信息,一种非常高效的方法就是将网络系统的功能扩展到智能手机终端上,让手机能够通过移动网络访问Web网站并处理各种各样的业务。
由于在大学学习过java语言,并且Andriod系统是基于java语言开发的,因此想开发一套基于Andriod平台的3G手机气象软件,并从网上获取天气预报信息。
Android平台的天气预报软件的开发可以进一步扩大气象信息的覆盖面,让广大Android手机用户能够在第一时间获取最新的天气预报信息,以便提前预防,方便出行。
同时,把气象灾害造成的损失降到最低,也可以提高公共服务质量,更好的发挥气象事业对经济社会发展的现实性作用,有巨大的实用价值。
虽然该技术在Android平台已经比较成熟,但是通过该软件的开发仍然能帮助我更好的认识Android系统的工作原理。
1.2项目需求分析
(1)系统能够通过手机精确定位全国各个城市未来几天的天气情况
(2)系统具有安全性,独立性,可靠性
(3)系统界面设计优美,符合用户的操作习惯
2.天气预报程序设计
2.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显示主界面布局
2.2欢迎界面的实现
考虑到程序界面的美观效果,在进入主界面之前我首先设置了一个用来跳转的Activity,并命名为LoginActivity。
在LoginActivity中显示login布局
Timertimer=newTimer();
finalIntentintent=newIntent(this,;
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
startActivity(intent);
;
}
};
timer.schedule(task,1000);
}
2.3主界面功能实现
第一次安装好进入程序界面时,系统会显示“本程序是第一次运行,请选择想要了解的城市”的窗口。
在这里我把默认城市设置为南京,如果用户不单击城市选择按钮的时候,则会显示的是南京近两天的天气情况。
如图4.3所示。
第一次运行时,我是通过在手机文件系统中判断是否存在一个名为shared_prefs的文件来判断是否为第一次运行,如果存在则不是第一次运行,系统会继续执行向下执行代码,如果系统中不存在该文件,则为第一次运行该程序,程序弹出对话框告诉用户。
在主程序界面,我运用的主要是ViewFlipper组件,通过该组件可以实现滑动显示界面,不过在设置滑动界面之前我们要先设定滑动的动画。
其中left_in中的代码为:
android="/res/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,; viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,; viewFlipper.showPrevious(); }elseif(touchDownX-touchUpX>100){ viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,; viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,; viewFlipper.showNext(); } returntrue; } returnfalse; } 获取天气信息并显示 天气预报系统最重要的当然是如何才能有效的获取天气信息了,要想获取实时的天气信息,我们就要访问专门提供天气信息的网站把网站返回的信息解析出想要的信息并显示在手机上。 通过网上的搜索,我找到了一个提供webservice的网站: .cn/webservices/weatherwebservice.asmx通过向这个网站提供参数就可以获取指定城市的天气信息了,该网站是从中央气象台接收的信息,数据准确可靠。 每隔两个小时更新一次天气情况,具有很好的实时性。 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 返回城市列表 publicstaticList { //需要调用的方法名(获得本天气预报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方法切割,只取需要的省份数据 privatestaticList { ArrayList 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(SoapEnvelope.VER11); SoapObjectsoapObject=newSoapObject(SERVICE_NS,methodName); //soapObject.addProperty("theCityCode",cityName); soapObject.addProperty("theCityName",cityName); envelope.bodyOut=soapObject; 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消息。 returndetail; } }catch(Exceptione) { e.printStackTrace(); } returnnull; } 接下来我们只需要对该文件解析就可以拿出我们需要的数据了。 然后把对应的数据添加在相应的地方即可。 城市列表的选择: 当我们单击城市选择按钮的时候会跳出城市选择界面对应的方法为 publicvoidshow_dialog(intcityId) { city_text=(TextView)findViewById(; switch(cityId) { caseCITY: //取得city_layout.xml中的视图 finalViewview=LayoutInflater.from(this).inflate( null); //省份Spinner province_spinner=(Spinner)view.findViewById(; //城市Spinner city_spinner=(Spinner)view.findViewById(; provinces=WebServiceUtil.getProvinceList(); ArrayAdapter adapter.setDropDownViewResource(; province_spinner.setAdapter(adapter); //省份Spinner监听器 province_spinner.setOnItemSelectedListener(newOnItemSelectedListener() { @Override publicvoidonItemSelected(AdapterView >view, Viewparent,intposition,longid) { citys=WebServiceUtil.getCityListByProvince(provinces.get(position)); ArrayAdapter citys); adapter1.setDropDownViewResource(; city_spinner.setAdapter(adapter1); } @Override publicvoidonNothingSelected(AdapterView >arg0) { } }); //城市Spinner监听器 city_spinner.setOnItemSelectedListener(newOnItemSelectedListener() { @Override publicvoidonItemSelected(AdapterView >arg0,Viewarg1, intposition,longarg3) { city_str=citys.get(position); } @Override publicvoidonNothingSelected(AdapterView >arg0) { } }); //选择城市对话框 AlertDialog.Builderdialog=newAlertDialog.Builder(this); dialog.setTitle("请选择所属城市"); dialog.setView(view); dialog.setPositiveButton("确定",newDialogInterface.OnClickListener() { @Override publicvoidonClick(DialogInterfacedialog,intwhich) { city_text.setText(city_str); writeSharedPreference(city_str); refresh(city_str); checkWeather(city_str); } }); dialog.setNegativeButton("取消",newDialogInterface.OnClickListener() { @Override publicvoidonClick(DialogInterfacedialog,intwhich) { dialog.dismiss(); } }); dialog.show(); break; default: break; } } 编写gps定位转换类用于定位当前位置信息ConverUtil。 由于GoogleSDK内部的一个小bug,我们不能直接利用手机内部来定位地址,必须要把当前的经纬度信息发送给谷歌网站来解析。 publicstaticStringgetAddress(doublelongitude,doublelatitude){ // HttpClientclient=newDe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 天气预报 报告