安卓天气预报查询app实验报告综述_第1页
安卓天气预报查询app实验报告综述_第2页
安卓天气预报查询app实验报告综述_第3页
安卓天气预报查询app实验报告综述_第4页
安卓天气预报查询app实验报告综述_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

引言题目描述本次实验是开发一款基于Android平台的天气预报应用,将网络系统的功能扩展到智能手机终端上,让手机能够通过移动网络访问Web网站并处理各种各样的业务,可以让智能手机用户能够随时随地查询互联网所提供的天气信息。设计意义可以让广大Android手机用户能够在第一时间获取最新的天气预报信息,以便提前预防,方便出行。同时,把气象灾害造成的损失降到最低,也可以提高公共服务质量,更好的发挥气象事业对经济社会发展的现实性作用,有巨大的实用价值。虽然该技术在Android平台已经比较成熟,但是通过该软件的开发仍然能帮助我更好的认识Android系统的工作原理。开发环境硬件环境戴尔灵越笔记本电脑软件环境Android的上层应用程序是用Java语言开发的,一般情况下是基于Dalvik虚拟机的,所以Google公司推荐使用主流的Java集成开发环境Eclipse。而用Java语言进行开发,需要用到SUN公司提供的Java

SDK(其中包括JRE:Java

Runtime

Environment)。此外,Android的应用程序开发和Java开发有较大区别的,需要使用Google提供的Android

SDK。同时,要在Eclipse上安装ADT,为Android开发提供开发工具的升级或者变更,是Eclipse下开发工具的升级或下载的工具。

简言之,需要以下软件,才能搭建Android开发环境,从而进行Android应用程序的开发。

(1)

Java

SDK

(2)

Eclipse

(3)

Android

SDK

(4)

ADT相关技术及知识点Activity应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:MAIN(activity的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个intentfilter则用于描述一个activity(或者IntentReceiver)能够操作哪些intent。一个activity如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。IntentFilter需要在AndroidManifest.xml中定义。通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。当startActivity方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:A、Activities能够重复利用从其它组件中以Intent的形式产生的一个请求;B、Activities可以在任何时候被一个具有相同IntentFilter的新的Activity取代。Service一个Service是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service一直执行,直到这个service运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service上(如果这个service还没有运行将启动它)。当连接到一个service之后,我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。Service使用步骤如下:

(1)继承service类;

(2)AndroidManifast.xml配置清单文件中<application>节点里对服务进行配置<servicename=".SMSService"/>。服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务通过startService()方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onStart(),如果服务已经启动再次调用只会触发onStart()方法。使用bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()-->onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-->onDestory()。网络通信JSON数据解析:(1)JavaScriptObjectNotation是一种轻量级的数据交换格式;(2)AndroidAPI中直接支持对JSON数据的处理;(3)常用类JSONObject、JSONArray、JSONStringer和JSONTokener等;(4)数据在名称/值对中、数据由逗号分隔、花括号保存对象、方括号保存数组。HttpURLConnection:提供了基于HTTP的网络访问方法,主要的操作步骤为:(1)利用URL地址实例化URL类;(2)由URL类创建HttpURLConnection对象;(3)以GET/POST方式向服务器发送请求;(4)接收服务器响应。需求分析系统功能需求分析能够由用户设置省份城市;根据用户设置的城市,点击刷新按钮获取当地当天的日期、天气信息以及未来六天的天气情况。以淡入淡出的方式显示主页面;打开软件时可以自动播放音乐,用户可以在Menu菜单里选择关闭音乐;Menu菜单里可以查看开发者信息。系统流程图打开软件打开软件界面界面启动网络连接网络连接 否 是进入进入主界面播放音乐播放音乐选择选择城市刷新刷新天气结束结束图4-1系统流程图系统界面需求分析目前国内软件开发者在设计过程中很注重软件的开发技术及其具有的业务功能,而忽略了用户对软件界面的需求,影响软件的易用性、友好性。界面设计要简约、美观,不能太复杂,让用户操作起来太繁琐,影响用户的使用体验,要在交互性与应用性上让用户感到舒适,让用户准确、高效、轻松、愉快地完成天气的查询,所以软件的友好性、易用性对软件系统至关重要。系统性能需求分析软件在完成功能需求之后,还要进一步的优化,不能占用手机太多的内存资源,在交互性上使用户获得最佳感受,让使用不同手机设备的用户都能有良好地体验。设计与实现界面布局在页面的布局上,因为界面设计的比较简单,所以只使用了基础的横向布局和纵向布局,横向布局与纵向布局交替使用,完成了天气预报的界面设计。图5-1界面布局图5-2软件主界面图5-3启动界面图5-4天气信息界面图5-5刷新界面图5-6作者信息界面省市二级联动将老师给的中国省市的编号手动输入到strings.xml文件中,再定义省份和城市编号两个数组,再定义ArrayAdapter,在两个下拉框上分别放上监听器,将省份与城市进行绑定,将所选择的城市的城市编号存放到一个数组之中,以便之后进行天气信息的获取。关键代码:privateint[]cities={R.array.beijing,R.array.tianjin,R.array.hebei,R.array.shanxi1,R.array.neimenggu,R.array.liaoning,R.array.jilin,R.array.heilongjiang,R.array.shanghai,R.array.jiangsu,R.array.zhejiang,R.array.anhui,R.array.fujian,R.array.jiangxi,R.array.shandong,R.array.henan,R.array.hubei,R.array.hunan,R.array.guangdong,R.array.guangxi,R.array.hainan,R.array.chongqing,R.array.sichuan,R.array.guizhou,R.array.yunnan,R.array.xizang,R.array.shanxi3,R.array.gansu,R.array.qinghai,R.array.ningxia,R.array.xinjiang,R.array.taiwan,R.array.xianggang};privateint[]citycode={R.array.bei_jing,R.array.tian_jin,R.array.he_bei,R.array.shan_xi1,R.array.nei_meng_gu,R.array.liao_ning,R.array.ji_lin,R.array.hei_long_jiang,R.array.shang_hai,R.array.jiang_su,R.array.zhe_jiang,R.array.an_hui,R.array.fu_jian,R.array.jiang_xi,R.array.shan_dong,R.array.he_nan,R.array.hu_bei,R.array.hu_nan,R.array.guang_dong,R.array.guang_xi,R.array.hai_nan,R.array.chong_qing,R.array.si_chuan,R.array.gui_zhou,R.array.yun_nan,R.array.xi_zang,R.array.shan_xi3,R.array.gan_su,R.array.qing_hai,R.array.ning_xia,R.array.xin_jiang,R.array.tai_wan,R.array.xiang_gang}; img1.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub AlertDialog.Builderbuilder=newAlertDialog.Builder( WeatherActivity.this); builder.setTitle("请选择所属城市"); Viewv1=LayoutInflater.from(WeatherActivity.this).inflate( R.layout.activity_cities,null); sp1=(Spinner)v1.findViewById(R.id.spinner1); sp2=(Spinner)v1.findViewById(R.id.spinner2); sp1.setOnItemSelectedListener(newOnItemSelectedListener(){ @Override publicvoidonItemSelected(AdapterView<?>parent, Viewview,intposition,longid){ //TODOAuto-generatedmethodstub adapter=ArrayAdapter.createFromResource( WeatherActivity.this,cities[position], android.R.layout.select_dialog_singlechoice); sp2.setAdapter(adapter); cit=getResources().getStringArray(citycode[position]); } @Override publicvoidonNothingSelected(AdapterView<?>parent){ //TODOAuto-generatedmethodstub } }); sp2.setOnItemSelectedListener(newOnItemSelectedListener(){ @Override publicvoidonItemSelected(AdapterView<?>parent, Viewview,intposition,longid){ //TODOAuto-generatedmethodstub st1=cit[position]; } @Override publicvoidonNothingSelected(AdapterView<?>parent){ //TODOAuto-generatedmethodstub } }); builder.setView(v1); builder.setPositiveButton("确定", newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog, intwhich){ //TODOAuto-generatedmethodstub wea_city.setText(sp2.getSelectedItem() .toString()); cityId=st1; ed.putString("city",wea_city.getText().toString()); ed.putString("citycode",cityId); mit(); refresh(); } }); builder.setNegativeButton("取消",null); AlertDialogdialog=builder.create(); dialog.show(); } }); 图5-7选择省份图5-8选择省份获取天气数据获取天气信息主要使用的是HttpURLConnection类,提供了基于HTTP的网络访问方法,由URL类创建HttpURLConnection对象,以GET/POST方式向服务器发送请求,接收服务器响应,最后通过JSON数据解析,将解析得到数据绑定到相应的组件中。关键代码:publicvoidrefresh(){ AlertDialog.Builderbuilder=newAlertDialog.Builder(WeatherActivity.this); Viewv1=LayoutInflater.from(WeatherActivity.this).inflate( R.layout.refresh_layout,null); builder.setTitle("Waiting"); refresh_textView=(TextView)v1.findViewById(R.id.refresh_textView); refresh_textView.setText("正在送来"+wea_city.getText()+"的天气信息"); builder.setView(v1); finalAlertDialogdialog=builder.create(); newThread(){ publicvoidrun(){ Stringurl=":88/?app=weather.future&weaid=" +cityId +"&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"; Log.i("da11111",url); HttpClientclient=newDefaultHttpClient(); HttpGetget=newHttpGet(url); try{ HttpResponseresponse=client.execute(get); HttpEntityis=response.getEntity(); parseJson(EntityUtils.toString(is)); }catch(ClientProtocolExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }; }.start(); dialog.show(); newThread(){ publicvoidrun(){ try{ sleep(1000); dialog.dismiss(); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }; }.start(); }publicvoidparseJson(Stringjsondata){ try{ Messagemsg=Message.obtain(); Bundledata=newBundle(); JSONObjectob=newJSONObject(jsondata); JSONArrayarr=ob.getJSONArray("result"); StringBuildersb=newStringBuilder(); for(inti=0;i<arr.length();i++){ JSONObjectjob=(JSONObject)arr.get(i); sb.append(job.getString("days")+","); Log.i("da","23333333"); sb.append(job.getString("week")+","); sb.append(job.getString("temperature")+","); sb.append(job.getString("humidity")+","); sb.append(job.getString("weather")+","); sb.append(job.getString("wind")+","); sb.append(job.getString("winp")+","); sb.append(job.getString("weather_icon")+","); sb.append(job.getString("weather_icon1")); data.putString("key"+i,sb.toString()); msg.setData(data); sb.setLength(0); } handler.sendMessage(msg); }catch(JSONExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }publicvoidgetImg(finalStringimg1_url,finalStringimg2_url){ newThread(){ @Override publicvoidrun(){ try{ URLurl1=newURL(img1_url); HttpURLConnectionconn1=(HttpURLConnection)url1 .openConnection(); conn1.setConnectTimeout(3000); conn1.setRequestMethod("GET"); intcode1=conn1.getResponseCode(); URLurl2=newURL(img2_url); HttpURLConnectionconn2=(HttpURLConnection)url2 .openConnection(); conn2.setConnectTimeout(3000); conn2.setRequestMethod("GET"); intcode2=conn2.getResponseCode(); if(code1==HttpURLConnection.HTTP_OK &&code2==HttpURLConnection.HTTP_OK){ InputStreamis1=conn1.getInputStream(); InputStreamis2=conn2.getInputStream(); bp=BitmapFactory.decodeStream(is1); bp1=BitmapFactory.decodeStream(is2); handler1.sendEmptyMessage(1); } }catch(MalformedURLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }; }.start(); }handler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ //TODOAuto-generatedmethodstub super.handleMessage(msg); MyAdapteradapter=newMyAdapter(WeatherActivity.this,msg.getData()); list.setAdapter(adapter); Stringstr=msg.getData().getString("key"+0); String[]st=str.split(","); day_textView.setText("今天"+st[1]); date_textView.setText(st[0]); weather.setText(st[4]); temperature.setText(st[2]); humidity.setText(st[3]); winp.setText(st[6]); wind.setText(st[5]); Stringimg1_url=st[7].toString(); Stringimg2_url=st[8].toString(); Log.i("ersdfsfgdvystnsdbrev",img2_url); getImg(img1_url,img2_url); handler1=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ //TODOAuto-generat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论