安卓天氣預(yù)報(bào)報(bào)告_第1頁(yè)
安卓天氣預(yù)報(bào)報(bào)告_第2頁(yè)
安卓天氣預(yù)報(bào)報(bào)告_第3頁(yè)
安卓天氣預(yù)報(bào)報(bào)告_第4頁(yè)
安卓天氣預(yù)報(bào)報(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)介

1、基于Android平臺(tái)的天氣預(yù)報(bào)系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)目錄1.前言1.1系統(tǒng)開(kāi)發(fā)的目的1.2 項(xiàng)目需求分析2.天氣預(yù)報(bào)程序設(shè)計(jì)2.1 Android的UI界面的實(shí)現(xiàn)2.2歡迎界面的實(shí)現(xiàn)2.3 主界面功能實(shí)現(xiàn)2.4數(shù)據(jù)存儲(chǔ)3.結(jié)束語(yǔ)1.前言1.1 系統(tǒng)開(kāi)發(fā)的目的由于智能手機(jī)的快速普及,智能操作系統(tǒng)在手機(jī)市場(chǎng)占據(jù)了很大一部分,其中以Andriod和iOS最為流行。為了讓智能手機(jī)用戶能夠隨時(shí)隨地查詢互聯(lián)網(wǎng)所提供的信息,一種非常高效的方法就是將網(wǎng)絡(luò)系統(tǒng)的功能擴(kuò)展到智能手機(jī)終端上,讓手機(jī)能夠通過(guò)移動(dòng)網(wǎng)絡(luò)訪問(wèn)Web網(wǎng)站并處理各種各樣的業(yè)務(wù)。由于在大學(xué)學(xué)習(xí)過(guò)java語(yǔ)言,并且Andriod系統(tǒng)是基于java語(yǔ)言開(kāi)

2、發(fā)的,因此想開(kāi)發(fā)一套基于Andriod平臺(tái)的3G手機(jī)氣象軟件,并從網(wǎng)上獲取天氣預(yù)報(bào)信息。Android平臺(tái)的天氣預(yù)報(bào)軟件的開(kāi)發(fā)可以進(jìn)一步擴(kuò)大氣象信息的覆蓋面,讓廣大Android手機(jī)用戶能夠在第一時(shí)間獲取最新的天氣預(yù)報(bào)信息,以便提前預(yù)防,方便出行。同時(shí),把氣象災(zāi)害造成的損失降到最低,也可以提高公共服務(wù)質(zhì)量,更好的發(fā)揮氣象事業(yè)對(duì)經(jīng)濟(jì)社會(huì)發(fā)展的現(xiàn)實(shí)性作用,有巨大的實(shí)用價(jià)值。雖然該技術(shù)在Android平臺(tái)已經(jīng)比較成熟,但是通過(guò)該軟件的開(kāi)發(fā)仍然能幫助我更好的認(rèn)識(shí)Android系統(tǒng)的工作原理。1.2 項(xiàng)目需求分析(1) 系統(tǒng)能夠通過(guò)手機(jī)精確定位全國(guó)各個(gè)城市未來(lái)幾天的天氣情況(2) 系統(tǒng)具有安全性,獨(dú)立性

3、,可靠性(3) 系統(tǒng)界面設(shè)計(jì)優(yōu)美,符合用戶的操作習(xí)慣2.天氣預(yù)報(bào)程序設(shè)計(jì)2.1 Android的UI界面的實(shí)現(xiàn)在Android中用戶界面都是布局在XML文件中的。這些XML文件放在工程/res/layout下面。這對(duì)以前熟悉java可視化編程的人來(lái)說(shuō)可能有些不太習(xí)慣??赡苡腥艘蓡?wèn)為什么要把布局文件放在XML文件里呢?其實(shí)有過(guò)web基礎(chǔ)的都應(yīng)該知道m(xù)vc框架,這是一種用于網(wǎng)站開(kāi)發(fā)的非常優(yōu)秀的思想,在安卓系統(tǒng)中,安卓開(kāi)發(fā)人員把用戶界面放在XML文檔中定義,這樣就可以讓XML文檔專門負(fù)責(zé)用戶UI界面設(shè)置,而java程序?qū)iT負(fù)責(zé)業(yè)務(wù)實(shí)現(xiàn),從而降低程序的耦合,便于程序的維護(hù)和擴(kuò)展,符合mvc設(shè)計(jì)思想。在

4、XML中Android開(kāi)發(fā)人員放置了很多我們經(jīng)常用到的一些組件,比如view,Button,EditText等,通過(guò)這些系統(tǒng)提供的控件,我們可以開(kāi)發(fā)出我們想要的程序界面來(lái)。Layout 是一類特殊的ViewGroup 控件,它們本身并不顯示任何的內(nèi)容,存在的惟一原因就是其中的內(nèi)部結(jié)構(gòu),能夠更好地?cái)[放它的子控件。比如Linearlayout(線性布局),可將子控件按水平或垂直方向按順序排列下去;Tablelayout(表格布局),可以將子控件按照表格的形式,一枚枚放置好;Relativelayout(相對(duì)布局),實(shí)際應(yīng)用中這個(gè)布局更靈活,它可以設(shè)定各個(gè)控件之間的對(duì)齊和排列關(guān)系,適合編寫(xiě)復(fù)雜的界面

5、。有了Layout 的存在,控件和控件之間不再是獨(dú)立地存在,而是更有機(jī)地結(jié)合在一起,設(shè)定起來(lái)也更為方便。在本程序中布局文件我一共用到了如圖4.1所示的布局文件圖 4.1 布局文件圖其中city_detail用來(lái)顯示城市簡(jiǎn)介的信息,city_environment用來(lái)顯示當(dāng)前所在城市的生活指數(shù)信息,city_layout用來(lái)顯示用來(lái)選擇城市布局,content_layout用來(lái)顯示天氣情況,gps_view用來(lái)顯示gps定位信息,login用來(lái)顯示登錄歡迎界面,main包含了用來(lái)切換的三個(gè)界面,tqyb顯示主界面布局2.2歡迎界面的實(shí)現(xiàn) 考慮到程序界面的美觀效果,在進(jìn)入主界面之前我首先設(shè)置了一個(gè)

6、用來(lái)跳轉(zhuǎn)的Activity,并命名為L(zhǎng)oginActivity。在LoginActivity中顯示login布局Timer timer = new Timer();final Intent intent = new Intent(this,edu.njue.app.WeatherWebServiceActivity.class);TimerTask task = new TimerTask()Overridepublic void run() startActivity(intent);LoginActivity.this.finish();timer.schedule(task, 1000)

7、;2.3 主界面功能實(shí)現(xiàn)第一次安裝好進(jìn)入程序界面時(shí),系統(tǒng)會(huì)顯示“本程序是第一次運(yùn)行,請(qǐng)選擇想要了解的城市”的窗口。在這里我把默認(rèn)城市設(shè)置為南京,如果用戶不單擊城市選擇按鈕的時(shí)候,則會(huì)顯示的是南京近兩天的天氣情況。如圖4.3所示。第一次運(yùn)行時(shí),我是通過(guò)在手機(jī)文件系統(tǒng)中判斷是否存在一個(gè)名為shared_prefs的文件來(lái)判斷是否為第一次運(yùn)行,如果存在則不是第一次運(yùn)行,系統(tǒng)會(huì)繼續(xù)執(zhí)行向下執(zhí)行代碼,如果系統(tǒng)中不存在該文件,則為第一次運(yùn)行該程序,程序彈出對(duì)話框告訴用戶。在主程序界面,我運(yùn)用的主要是ViewFlipper組件,通過(guò)該組件可以實(shí)現(xiàn)滑 動(dòng)顯示界面,不過(guò)在設(shè)置滑動(dòng)界面之前我們要先設(shè)定滑動(dòng)的動(dòng)畫(huà)。

8、其中l(wèi)eft_in中的代碼為: 當(dāng)我們定義了滑動(dòng)效果之后還要在main.xml中把想要滑動(dòng)的布局包含進(jìn)去。 有了這個(gè)布局之后我們就可以在主程序界面調(diào)用界面進(jìn)行切換了。主程序?qū)崿F(xiàn)觸屏監(jiān)聽(tīng)接口,監(jiān)聽(tīng)觸摸時(shí)的x,y坐標(biāo),以及當(dāng)手指離開(kāi)時(shí)的坐標(biāo),如果兩者之間的距離大于或小于100像素,則認(rèn)為想要實(shí)現(xiàn)滑動(dòng)。public boolean onTouch(View v, MotionEvent event) if(event.getAction()=MotionEvent.ACTION_DOWN)touchDownX = event.getX();return true;else if(event.getA

9、ction()=MotionEvent.ACTION_UP)touchUpX = event.getX();if(touchUpX-touchDownX100)/從左往右滑動(dòng)viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_in_left);viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_out_right);viewFlipper.showPrevious();else i

10、f(touchDownX-touchUpX100)viewFlipper.setAnimation(AnimationUtils.loadAnimation(this, R.anim.right_in);viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,R.anim.left_out);viewFlipper.showNext();return true;return false;獲取天氣信息并顯示天氣預(yù)報(bào)系統(tǒng)最重要的當(dāng)然是如何才能有效的獲取天氣信息了,要想獲取實(shí)時(shí)的天氣信息,我們就要訪問(wèn)專門提供天氣信息的網(wǎng)站把網(wǎng)站返回的信息

11、解析出想要的信息并顯示在手機(jī)上。通過(guò)網(wǎng)上的搜索,我找到了一個(gè)提供webservice的網(wǎng)站:/webservices/weatherwebservice.asmx 通過(guò)向這個(gè)網(wǎng)站提供參數(shù)就可以獲取指定城市的天氣信息了,該網(wǎng)站是從中央氣象臺(tái)接收的信息,數(shù)據(jù)準(zhǔn)確可靠。每隔兩個(gè)小時(shí)更新一次天氣情況,具有很好的實(shí)時(shí)性。Webservice的出現(xiàn)成功的解決了不同平臺(tái)和語(yǔ)言之間進(jìn)行數(shù)據(jù)交換的問(wèn)題,它主要使用XML文檔來(lái)傳遞消息,并將該消息發(fā)送給任何請(qǐng)求對(duì)象,由于不同系統(tǒng)對(duì)XML的完美支持,因此從根本上完善了跨平臺(tái)服務(wù),任何時(shí)刻、任何平臺(tái)我們可以使用任何語(yǔ)言來(lái)訪

12、問(wèn)該Webservice服務(wù)。對(duì)于Webservice使用者而言,webservice API與任何操作平臺(tái)無(wú)關(guān),它只是以XML語(yǔ)言作為數(shù)據(jù)交換格式。Webservice平臺(tái)主要涉及到的技術(shù)是SOAP(Simple Object Access Protocol),WSDL(Web Service Description Language)SOAP依賴于XML文檔來(lái)構(gòu)建,一條SOAP消息就是一份特定的XML文檔,SOAP主要包含三個(gè)方面的主要元素:(1) 根元素,該元素是必填的。其中SOAP消息用來(lái)傳遞的數(shù)據(jù)的XML文檔以該元素作為根元素(2) 元素,該元素是選填的。它包含了SOAP消息的頭信息

13、(3) 元素,該元素是必填的。它包含所有的調(diào)用和相應(yīng)的內(nèi)容Java本身提供了很豐富的Web Service支持,比如Sun公司制定的JAX-WS 2規(guī)范,Apache開(kāi)源組織提供的Axis1,Axis2,CXF等。我們可以使用Google公司為Android平臺(tái)開(kāi)發(fā)的專門處理Webservice信息的ksoap2-android進(jìn)行客戶端的開(kāi)發(fā)。使用該第三方包的方法為:1.創(chuàng)建HttpTrasportSE對(duì)象2.創(chuàng)建SoapSerializationEnvelope對(duì)象3.創(chuàng)建SoapObject對(duì)象,創(chuàng)建該對(duì)象時(shí)需要傳入所要調(diào)用Web Service的命名空間4.如果有參數(shù)需要傳給WebSe

14、rvice服務(wù)器端,調(diào)用SoapObject對(duì)象的addProperty(String name,Object value)方法來(lái)設(shè)置參數(shù),該方法的name參數(shù)指定參數(shù)名,value指定參數(shù)值5.調(diào)用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接對(duì)bodyout屬性賦值,將前兩步創(chuàng)建的SoapObject對(duì)象設(shè) SoapSerializationEnvelope的傳出SOAP消息體6.調(diào)用對(duì)象的call()方法,并以SoapSerializationEnvelope作為參數(shù)調(diào)用遠(yuǎn)程的WebService7.調(diào)用完成后,訪問(wèn)SoapS

15、erializationEnvelope對(duì)象的bodyin屬性,該屬性返回一個(gè)SoapObject對(duì)象,該對(duì)象就代表了Web Service的返回消息,解析該SoapObject對(duì)象,即可獲取調(diào)用Web Service的返回值。基于此編寫(xiě)調(diào)用webservice服務(wù)的類WebServiceUtil返回城市列表public static List getProvinceList()/ 需要調(diào)用的方法名(獲得本天氣預(yù)報(bào)Web Services支持的洲、國(guó)內(nèi)外省份和城市信息)/String methodName = getRegionProvince;String methodName = getS

16、upportProvince;/ 創(chuàng)建HttpTransportSE傳輸對(duì)象HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL);httpTranstation.debug = true;/ 使用SOAP1.1協(xié)議創(chuàng)建Envelop對(duì)象SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);/ 實(shí)例化SoapObject對(duì)象SoapObject soapObject = new SoapObject

17、(SERVICE_NS, methodName);envelope.bodyOut = soapObject;/ 設(shè)置與.Net提供的Web Service保持較好的兼容性envelope.dotNet = true;try/ 調(diào)用Web ServicehttpTranstation.call(SERVICE_NS + methodName, envelope);if (envelope.getResponse() != null)/ 獲取服務(wù)器響應(yīng)返回的SOAP消息SoapObject result = (SoapObject) envelope.bodyIn;SoapObject deta

18、il = (SoapObject) result.getProperty(methodName+ Result);/ 解析服務(wù)器響應(yīng)的SOAP消息。return parseProvinceOrCity(detail); catch (Exception e)e.printStackTrace();return null;解析出省份和城市,把返回的數(shù)據(jù)用split方法切割,只取需要的省份數(shù)據(jù)private static List parseProvinceOrCity(SoapObject detail)ArrayList result = new ArrayList();for (int i

19、= 0; i detail.getPropertyCount(); i+)String str = detail.getProperty(i).toString();/ 解析出每個(gè)省份result.add(str.split( )0);return result;通過(guò)具體的城市獲取天氣信息public static SoapObject getWeatherByCity(String cityName) / 根據(jù)城市或地區(qū)名稱查詢獲得未來(lái)三天內(nèi)天氣情況、現(xiàn)在的天氣實(shí)況、天氣和生活指數(shù)/String methodName = getWeather;String methodName = getW

20、eatherbyCityName;HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL);httpTranstation.debug = true; SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);/soapObject.addProperty(theCityCode,

21、 cityName);soapObject.addProperty(theCityName,cityName);envelope.bodyOut = soapObject;envelope.dotNet = true;try/ 調(diào)用Web ServicehttpTranstation.call(SERVICE_NS + methodName, envelope);if (envelope.getResponse() != null)/ 獲取服務(wù)器響應(yīng)返回的SOAP消息SoapObject result = (SoapObject) envelope.bodyIn;SoapObject deta

22、il = (SoapObject) result.getProperty(methodName+ Result);/ 解析服務(wù)器響應(yīng)的SOAP消息。return detail; catch (Exception e)e.printStackTrace();return null;接下來(lái)我們只需要對(duì)該文件解析就可以拿出我們需要的數(shù)據(jù)了。然后把對(duì)應(yīng)的數(shù)據(jù)添加在相應(yīng)的地方即可。城市列表的選擇:當(dāng)我們單擊城市選擇按鈕的時(shí)候會(huì)跳出城市選擇界面對(duì)應(yīng)的方法為public void show_dialog(int cityId)city_text = (TextView)findViewById(R.id.c

23、ity_text);switch (cityId)case CITY:/ 取得city_layout.xml中的視圖final View view = LayoutInflater.from(this).inflate(R.layout.city_layout, null);/ 省份Spinnerprovince_spinner = (Spinner) view.findViewById(R.vince_spinner);/ 城市Spinnercity_spinner = (Spinner) view.findViewById(R.id.city_spinner);province

24、s = WebServiceUtil.getProvinceList();ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, provinces);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);province_spinner.setAdapter(adapter);/ 省份Spinner監(jiān)聽(tīng)器province_spinner.setOnItemSelectedListe

25、ner(new OnItemSelectedListener()Overridepublic void onItemSelected(AdapterView view,View parent, int position, long id)citys = WebServiceUtil.getCityListByProvince(provinces.get(position);ArrayAdapter adapter1 = new ArrayAdapter(WeatherWebServiceActivity.this,android.R.layout.simple_spinner_item, ci

26、tys);adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);city_spinner.setAdapter(adapter1);Overridepublic void onNothingSelected(AdapterView arg0);/ 城市Spinner監(jiān)聽(tīng)器city_spinner.setOnItemSelectedListener(new OnItemSelectedListener()Overridepublic void onItemSelected(AdapterVi

27、ew arg0, View arg1,int position, long arg3)city_str = citys.get(position);Overridepublic void onNothingSelected(AdapterView arg0);/ 選擇城市對(duì)話框AlertDialog.Builder dialog = new AlertDialog.Builder(this);dialog.setTitle(請(qǐng)選擇所屬城市);dialog.setView(view);dialog.setPositiveButton(確定,new DialogInterface.OnClickL

28、istener()Overridepublic 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()Overridepublic void onClick(DialogInterface dialog, int which

29、)dialog.dismiss(););dialog.show();break;default:break;編寫(xiě)gps定位轉(zhuǎn)換類用于定位當(dāng)前位置信息ConverUtil。由于Google SDK內(nèi)部的一個(gè)小bug,我們不能直接利用手機(jī)內(nèi)部來(lái)定位地址,必須要把當(dāng)前的經(jīng)緯度信息發(fā)送給谷歌網(wǎng)站來(lái)解析。public static String getAddress(double longitude,double latitude)/HttpClient client = new DefaultHttpClient();/Get方法得到內(nèi)容HttpGet httpGet = new HttpGet(ht

30、tp://maps/api/+ geocode/json?latlng=+ latitude + , + longitude + &sensor=false®ion=cn);StringBuilder sb = new StringBuilder();tryHttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();/獲取服務(wù)器響應(yīng)的字符串InputStream is = entity.getContent();int b;while(b =

31、 is.read()!=-1)sb.append(char)b);/把服務(wù)器相應(yīng)的字符串轉(zhuǎn)化為JSon對(duì)象JSONObject jsonObj = new JSONObject(sb.toString();/解析出相應(yīng)結(jié)果中的地址信息String s1 = jsonObj.getJSONArray(results).getJSONObject(0).getString(formatted_address);String s2 = s1.split(,)3;Log.i(start, s2);return jsonObj.getJSONArray(results).getJSONObject(0)

32、.getString(formatted_address);catch(Exception e)e.printStackTrace();return null;本軟件同樣實(shí)現(xiàn)了傳感器接口,可以實(shí)時(shí)監(jiān)測(cè)當(dāng)前外部溫度,增加用戶的友好體驗(yàn),主要方法為:public void onSensorChanged(SensorEvent event) / TODO Auto-generated method stubfloat values = event.values;/真機(jī)上獲取觸發(fā)event的傳感器類型/int sensorType = event.sensor.getType();/模擬器上獲取觸發(fā)

33、event的傳感器類型int sensorType = event.type;StringBuilder sb = null;switch(sensorType)case Sensor.TYPE_TEMPERATURE:sb = new StringBuilder();sb.append(values0);sb.append();et.setText(sb.toString();break;default:break;2.4數(shù)據(jù)存儲(chǔ)有時(shí)候應(yīng)用程序需要有數(shù)據(jù)保存,而且這些數(shù)據(jù)都比較簡(jiǎn)單,基本上只是一些簡(jiǎn)單的字符串,標(biāo)量類型的值等。對(duì)于這種數(shù)據(jù),Android提供了SharedPreferences進(jìn)行保存。SharedPreferences主要保存的是一些簡(jiǎn)單的key-value對(duì)。在本程序中,我首先設(shè)置了一個(gè)判斷網(wǎng)絡(luò)狀態(tài)連通情況的方法,返回一個(gè)Boolean類型的值,如果網(wǎng)絡(luò)正常連接,則會(huì)從網(wǎng)絡(luò)刷新天氣

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論