安卓天氣預(yù)報(bào)查詢app實(shí)驗(yàn)報(bào)告_第1頁(yè)
安卓天氣預(yù)報(bào)查詢app實(shí)驗(yàn)報(bào)告_第2頁(yè)
安卓天氣預(yù)報(bào)查詢app實(shí)驗(yàn)報(bào)告_第3頁(yè)
安卓天氣預(yù)報(bào)查詢app實(shí)驗(yàn)報(bào)告_第4頁(yè)
安卓天氣預(yù)報(bào)查詢app實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

課程設(shè)計(jì)報(bào)告課程名稱:移動(dòng)平臺(tái)開發(fā)設(shè)計(jì)題目:天氣預(yù)報(bào)院系:計(jì)算機(jī)科學(xué)與工程學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):學(xué)號(hào):姓名:指導(dǎo)教師:孫霞設(shè)計(jì)地點(diǎn):N6-113開課時(shí)間:2023至2023學(xué)年第1學(xué)期目錄1.引言11.1.題目描述11.2.設(shè)計(jì)意義12.開發(fā)環(huán)境12.1.硬件環(huán)境12.2.軟件環(huán)境13.相關(guān)技術(shù)及知識(shí)點(diǎn)23.1.Activity23.2.Service23.3.網(wǎng)絡(luò)通信34.需求分析34.1.系統(tǒng)功能需求分析34.2.系統(tǒng)流程圖44.3.系統(tǒng)界面需求分析44.4.系統(tǒng)性能需求分析45.設(shè)計(jì)與實(shí)現(xiàn)55.1.界面布局55.2.省市二級(jí)聯(lián)動(dòng)65.3.獲取天氣數(shù)據(jù)95.4.播放背景音樂(lè)136.個(gè)人總結(jié)14參考資料15引言題目描述本次實(shí)驗(yàn)是開發(fā)一款基于Android平臺(tái)的天氣預(yù)報(bào)應(yīng)用,將網(wǎng)絡(luò)系統(tǒng)的功能擴(kuò)展到智能終端上,讓能夠通過(guò)移動(dòng)網(wǎng)絡(luò)訪問(wèn)Web網(wǎng)站并處理各種各樣的業(yè)務(wù),可以讓智能用戶能夠隨時(shí)隨地查詢互聯(lián)網(wǎng)所提供的天氣信息。設(shè)計(jì)意義可以讓廣闊Android用戶能夠在第一時(shí)間獲取最新的天氣預(yù)報(bào)信息,以便提前預(yù)防,方便出行。同時(shí),把氣象災(zāi)害造成的損失降到最低,也可以提高公共效勞質(zhì)量,更好的發(fā)揮氣象事業(yè)對(duì)經(jīng)濟(jì)社會(huì)開展的現(xiàn)實(shí)性作用,有巨大的實(shí)用價(jià)值。雖然該技術(shù)在Android平臺(tái)已經(jīng)比擬成熟,但是通過(guò)該軟件的開發(fā)仍然能幫助我更好的認(rèn)識(shí)Android系統(tǒng)的工作原理。開發(fā)環(huán)境硬件環(huán)境戴爾靈越筆記本電腦軟件環(huán)境Android的上層應(yīng)用程序是用Java語(yǔ)言開發(fā)的,一般情況下是基于Dalvik虛擬機(jī)的,所以Google公司推薦使用主流的Java集成開發(fā)環(huán)境Eclipse。而用Java語(yǔ)言進(jìn)行開發(fā),需要用到SUN公司提供的JavaSDK(其中包括JRE:JavaRuntimeEnvironment)。此外,Android的應(yīng)用程序開發(fā)和Java開發(fā)有較大區(qū)別的,需要使用Google提供的AndroidSDK。同時(shí),要在Eclipse上安裝ADT,為Android開發(fā)提供開發(fā)工具的升級(jí)或者變更,是Eclipse下開發(fā)工具的升級(jí)或下載的工具。簡(jiǎn)言之,需要以下軟件,才能搭建Android開發(fā)環(huán)境,從而進(jìn)行Android應(yīng)用程序的開發(fā)。(1)

Java

SDK

(2)

Eclipse

(3)

Android

SDK

(4)

ADT相關(guān)技術(shù)及知識(shí)點(diǎn)Activity應(yīng)用程序中,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕,它上面可以顯示一些控件也可以監(jiān)聽并處理用戶的事件做出響應(yīng)。Activity之間通過(guò)Intent進(jìn)行通信。在Intent的描述結(jié)構(gòu)中,有兩個(gè)最重要的局部:動(dòng)作和動(dòng)作對(duì)應(yīng)的數(shù)據(jù)。典型的動(dòng)作類型有:MAIN〔activity的門戶〕、VIEW、PICK、EDIT等。而動(dòng)作對(duì)應(yīng)的數(shù)據(jù)那么以URI的形式進(jìn)行表示。例如:要查看一個(gè)人的聯(lián)系方式,你需要?jiǎng)?chuàng)立一個(gè)動(dòng)作類型為VIEW的intent,以及一個(gè)表示這個(gè)人的URI。與之有關(guān)系的一個(gè)類叫IntentFilter。相對(duì)于intent是一個(gè)有效的做某事的請(qǐng)求,一個(gè)intentfilter那么用于描述一個(gè)activity〔或者IntentReceiver〕能夠操作哪些intent。一個(gè)activity如果要顯示一個(gè)人的聯(lián)系方式時(shí),需要聲明一個(gè)IntentFilter,這個(gè)IntentFilter要知道怎么去處理VIEW動(dòng)作和表示一個(gè)人的URI。IntentFilter需要在AndroidManifest.xml中定義。通過(guò)解析各種intent,從一個(gè)屏幕導(dǎo)航到另一個(gè)屏幕是很簡(jiǎn)單的。當(dāng)向前導(dǎo)航時(shí),activity將會(huì)調(diào)用startActivity(IntentmyIntent)方法。然后,系統(tǒng)會(huì)在所有安裝的應(yīng)用程序中定義的IntentFilter中查找,找到最匹配myIntent的Intent對(duì)應(yīng)的activity。新的activity接收到myIntent的通知后,開始運(yùn)行。當(dāng)startActivity方法被調(diào)用將觸發(fā)解析myIntent的動(dòng)作,這個(gè)機(jī)制提供了兩個(gè)關(guān)鍵好處:A、Activities能夠重復(fù)利用從其它組件中以Intent的形式產(chǎn)生的一個(gè)請(qǐng)求;B、Activities可以在任何時(shí)候被一個(gè)具有相同IntentFilter的新的Activity取代。Service一個(gè)Service是一段長(zhǎng)生命周期的,沒有用戶界面的程序,可以用來(lái)開發(fā)如監(jiān)控類程序。比擬好的一個(gè)例子就是一個(gè)正在從播放列表中播放歌曲的媒體播放器。在一個(gè)媒體播放器的應(yīng)用中,應(yīng)該會(huì)有多個(gè)activity,讓使用者可以選擇歌曲并播放歌曲。然而,音樂(lè)重放這個(gè)功能并沒有對(duì)應(yīng)的activity,因?yàn)槭褂谜弋?dāng)然會(huì)認(rèn)為在導(dǎo)航到其它屏幕時(shí)音樂(lè)應(yīng)該還在播放的。在這個(gè)例子中,媒體播放器這個(gè)activity會(huì)使用Context.startService()來(lái)啟動(dòng)一個(gè)service,從而可以在后臺(tái)保持音樂(lè)的播放。同時(shí),系統(tǒng)也將保持這個(gè)service一直執(zhí)行,直到這個(gè)service運(yùn)行結(jié)束。另外,我們還可以通過(guò)使用Context.bindService()方法,連接到一個(gè)service上〔如果這個(gè)service還沒有運(yùn)行將啟動(dòng)它〕。當(dāng)連接到一個(gè)service之后,我們還可以service提供的接口與它進(jìn)行通訊。拿媒體播放器這個(gè)例子來(lái)說(shuō),我們還可以進(jìn)行暫停、重播等操作。Service使用步驟如下:〔1〕繼承service類;〔2〕AndroidManifast.xml配置清單文件中<application>節(jié)點(diǎn)里對(duì)效勞進(jìn)行配置<servicename=".SMSService"/>。效勞不能自己運(yùn)行,需要通過(guò)Contex.startService()或Contex.bindService()啟動(dòng)效勞通過(guò)startService()方法啟動(dòng)的效勞于調(diào)用者沒有關(guān)系,即使調(diào)用者關(guān)閉了,效勞仍然運(yùn)行想停止效勞要調(diào)用Context.stopService(),此時(shí)系統(tǒng)會(huì)調(diào)用onDestory(),使用此方法啟動(dòng)時(shí),效勞首次啟動(dòng)系統(tǒng)先調(diào)用效勞的onCreate()-->onStart(),如果效勞已經(jīng)啟動(dòng)再次調(diào)用只會(huì)觸發(fā)onStart()方法。使用bindService()啟動(dòng)的效勞與調(diào)用者綁定,只要調(diào)用者關(guān)閉效勞就終止,使用此方法啟動(dòng)時(shí),效勞首次啟動(dòng)系統(tǒng)先調(diào)用效勞的onCreate()-->onBind(),如果效勞已經(jīng)啟動(dòng)再次調(diào)用不會(huì)再觸發(fā)這2個(gè)方法,調(diào)用者退出時(shí)系統(tǒng)會(huì)調(diào)用效勞的onUnbind()-->onDestory(),想主動(dòng)解除綁定可使用Contex.unbindService(),系統(tǒng)依次調(diào)用onUnbind()-->onDestory()。網(wǎng)絡(luò)通信JSON數(shù)據(jù)解析:〔1〕JavaScriptObjectNotation是一種輕量級(jí)的數(shù)據(jù)交換格式;〔2〕AndroidAPI中直接支持對(duì)JSON數(shù)據(jù)的處理;〔3〕常用類JSONObject、JSONArray、JSONStringer和JSONTokener等;〔4〕數(shù)據(jù)在名稱/值對(duì)中、數(shù)據(jù)由逗號(hào)分隔、花括號(hào)保存對(duì)象、方括號(hào)保存數(shù)組。URLConnection:提供了基于的網(wǎng)絡(luò)訪問(wèn)方法,主要的操作步驟為:〔1〕利用URL地址實(shí)例化URL類;〔2〕由URL類創(chuàng)立URLConnection對(duì)象;〔3〕以GET/POST方式向效勞器發(fā)送請(qǐng)求;〔4〕接收效勞器響應(yīng)。需求分析系統(tǒng)功能需求分析能夠由用戶設(shè)置省份城市;根據(jù)用戶設(shè)置的城市,點(diǎn)擊刷新按鈕獲取當(dāng)?shù)禺?dāng)天的日期、天氣信息以及未來(lái)六天的天氣情況。以淡入淡出的方式顯示主頁(yè)面;翻開軟件時(shí)可以自動(dòng)播放音樂(lè),用戶可以在Menu菜單里選擇關(guān)閉音樂(lè);Menu菜單里可以查看開發(fā)者信息。系統(tǒng)流程圖翻開翻開軟件界面界面啟動(dòng)網(wǎng)絡(luò)連接網(wǎng)絡(luò)連接否是進(jìn)入進(jìn)入主界面播放音樂(lè)播放音樂(lè)選擇選擇城市刷新刷新天氣結(jié)束結(jié)束圖4-1系統(tǒng)流程圖系統(tǒng)界面需求分析目前國(guó)內(nèi)軟件開發(fā)者在設(shè)計(jì)過(guò)程中很注重軟件的開發(fā)技術(shù)及其具有的業(yè)務(wù)功能,而忽略了用戶對(duì)軟件界面的需求,影響軟件的易用性、友好性。界面設(shè)計(jì)要簡(jiǎn)約、美觀,不能太復(fù)雜,讓用戶操作起來(lái)太繁瑣,影響用戶的使用體驗(yàn),要在交互性與應(yīng)用性上讓用戶感到舒適,讓用戶準(zhǔn)確、高效、輕松、愉快地完成天氣的查詢,所以軟件的友好性、易用性對(duì)軟件系統(tǒng)至關(guān)重要。系統(tǒng)性能需求分析軟件在完成功能需求之后,還要進(jìn)一步的優(yōu)化,不能占用太多的內(nèi)存資源,在交互性上使用戶獲得最正確感受,讓使用不同設(shè)備的用戶都能有良好地體驗(yàn)。設(shè)計(jì)與實(shí)現(xiàn)界面布局在頁(yè)面的布局上,因?yàn)榻缑嬖O(shè)計(jì)的比擬簡(jiǎn)單,所以只使用了根底的橫向布局和縱向布局,橫向布局與縱向布局交替使用,完成了天氣預(yù)報(bào)的界面設(shè)計(jì)。圖5-1界面布局圖5-2軟件主界面圖5-3啟動(dòng)界面圖5-4天氣信息界面圖5-5刷新界面圖5-6作者信息界面省市二級(jí)聯(lián)動(dòng)將老師給的中國(guó)省市的編號(hào)手動(dòng)輸入到strings.xml文件中,再定義省份和城市編號(hào)兩個(gè)數(shù)組,再定義ArrayAdapter,在兩個(gè)下拉框上分別放上監(jiān)聽器,將省份與城市進(jìn)行綁定,將所選擇的城市的城市編號(hào)存放到一個(gè)數(shù)組之中,以便之后進(jìn)行天氣信息的獲取。關(guān)鍵代碼: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(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstub AlertDialog.Builderbuilder=newAlertDialog.Builder(WeatherActivity.this); builder.setTitle("請(qǐng)選擇所屬城市"); 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(){@OverridepublicvoidonItemSelected(AdapterView<?>parent, Viewview,intposition,longid){//TODOAuto-generatedmethodstubadapter=ArrayAdapter.createFromResource(WeatherActivity.this,cities[position], android.R.layout.select_dialog_singlechoice);sp2.setAdapter(adapter);cit=getResources().getStringArray(citycode[position]); }@OverridepublicvoidonNothingSelected(AdapterView<?>parent){//TODOAuto-generatedmethodstub } });sp2.setOnItemSelectedListener(newOnItemSelectedListener(){@OverridepublicvoidonItemSelected(AdapterView<?>parent, Viewview,intposition,longid){//TODOAuto-generatedmethodstubst1=cit[position]; }@OverridepublicvoidonNothingSelected(AdapterView<?>parent){//TODOAuto-generatedmethodstub } }); builder.setView(v1); builder.setPositiveButton("確定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//TODOAuto-generatedmethodstubwea_city.setText(sp2.getSelectedItem() .toString());cityId=st1;ed.putString("city",wea_city.getText().toString());ed.putString("citycode",cityId);edmit(); refresh(); } }); builder.setNegativeButton("取消",null); AlertDialogdialog=builder.create(); dialog.show(); } }); 圖5-7選擇省份圖5-8選擇省份獲取天氣數(shù)據(jù)獲取天氣信息主要使用的是URLConnection類,提供了基于的網(wǎng)絡(luò)訪問(wèn)方法,由URL類創(chuàng)立URLConnection對(duì)象,以GET/POST方式向效勞器發(fā)送請(qǐng)求,接收效勞器響應(yīng),最后通過(guò)JSON數(shù)據(jù)解析,將解析得到數(shù)據(jù)綁定到相應(yīng)的組件中。關(guān)鍵代碼: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("正在送來(lái)"+wea_city.getText()+"的天氣信息"); builder.setView(v1);finalAlertDialogdialog=builder.create();newThread(){publicvoidrun(){ Stringurl="://api.k780:88/?app=weather.future&weaid=" +cityId +"&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"; Log.i("da11111",url); Clientclient=newDefaultClient(); Getget=newGet(url);try{ Responseresponse=client.execute(get); Entityis=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(){@Overridepublicvoidrun(){try{ URLurl1=newURL(img1_url); URLConnectionconn1=(URLConnection)url1 .openConnection(); conn1.setConnectTimeout(3000); conn1.setRequestMethod("GET");intcode1=conn1.getResponseCode(); URLurl2=newURL(img2_url); URLConnectionconn2=(URLConnection)url2 .openConnection(); conn2.setConnectTimeout(3000); conn2.setRequestMethod("GET");intcode2=conn2.getResponseCode();if(code1==URLConnection._OK &&code2==URLConnection._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(){@OverridepublicvoidhandleMessage(Messagemsg){//TODOAuto-generatedmethodstubsuper.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(){@Overridepublicvo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論