<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 消費電子 > 設計應用 > 基于A(yíng)ndroid智能手機天氣預報系統設計及實(shí)現

基于A(yíng)ndroid智能手機天氣預報系統設計及實(shí)現

作者: 時(shí)間:2017-06-08 來(lái)源:網(wǎng)絡(luò ) 收藏

0 引言

本文引用地址:http://dyxdggzs.com/article/201706/351171.htm

為了讓用戶(hù)能夠隨時(shí)隨地查詢(xún)互聯(lián)網(wǎng)所提供的服務(wù),一種高效的辦法就是將應用系統的功能拓展到手機終端,讓手機能通過(guò)移動(dòng)網(wǎng)和互聯(lián)網(wǎng)訪(fǎng)問(wèn)Web 網(wǎng)站并處理各項業(yè)務(wù)。 系統是Google 公司開(kāi)發(fā)的一個(gè)開(kāi)源手機操作系統,它包括了操作系統、用戶(hù)界面和應用程序,即工作所需的全部軟件。 的最大特點(diǎn)是它的開(kāi)放性體系架構,不僅具有非常好的開(kāi)發(fā)、調試環(huán)境,而且還具有各種可擴展的設施,包括豐富的圖形組件、多媒體支持功能和強大的瀏覽器,而且已有許多比較成熟的應用案例。

本文提出了天氣實(shí)況預報系統的一種設計實(shí)現方法,供開(kāi)發(fā)者參考。

1 應用程序設計原理

一個(gè)Android 應用程序,通常由AcTIvity、Intent Receiver、Service、CONtent Provider 四種功能組件構成。但是,并不是每一個(gè)Android 應用程序都需要用到這四種功能組件,而是只需上述四種功能組件的某些組合。

1.1 Activity

Activity 是最基本的Android 應用程序組件。大多數應用由多個(gè)屏幕組成,一個(gè)Activity 通常則是一個(gè)單獨的屏幕。每一個(gè)Activity 都被實(shí)現為一個(gè)獨立的類(lèi),并且從Activity 基類(lèi)中繼承而來(lái)。Activity 類(lèi)將會(huì )顯示由視圖控件組成的用戶(hù)接口,并對事件做出響應。Android 使用Intent 這個(gè)特殊類(lèi),實(shí)現在屏幕與屏幕之間移動(dòng)。通過(guò)解析各種Intent,從一個(gè)屏幕導航到另一個(gè)屏幕是很簡(jiǎn)單的。當向前導航時(shí),Activity 將會(huì )調用STartActivity(Intent myIntent)方法,然后,系統會(huì )在所有安裝的應用程序中所定義的IntentFilter 中查找,找到最匹配myIntent的和Intent 對應的Activity.新的Activity 接收到myIntent 的通知后,開(kāi)始運行。當startActivity 方法被調用時(shí)將觸發(fā)解析myIntent 的動(dòng)作。這個(gè)機制具有兩點(diǎn)優(yōu)勢:一是能夠重復利用從其他組件中以Intent 形式產(chǎn)生的一個(gè)請求;二是Activity 可以在任何時(shí)候被一個(gè)具有相同IntentFilter 的新Activity 取代。

1.2 Intent Receiver

通過(guò)Intent Receiver 實(shí)現的應用能夠對一個(gè)外部的事件作出響應。Intent Receiver 在A(yíng)ndroidManifest.xml 中注冊,也可以在代碼中使用Context.registerReceiver()進(jìn)行注冊。當一個(gè)IntentReceiver 被觸發(fā)時(shí),應用不必對請求調用Intent Receiver,系統會(huì )在需要的時(shí)候啟動(dòng)應用。各種應用還可以通過(guò)使用Context.

brOAdcastIntent()將它們自己的Intent Receiver廣播給其他應用程序。

1.3 Service

Service 是一段長(cháng)生命周期的、沒(méi)有用戶(hù)界面的程序。例如媒體播放器這個(gè)Activity 會(huì )使用Context.startService()來(lái)啟動(dòng)一個(gè)Service,從而可以在后臺播放音樂(lè )。同時(shí),系統也將保持這個(gè)Service 一直執行,直到Service 運行結束。系統可通過(guò)使用Context.bindService()方法,連接到一個(gè)Service 上(如果這個(gè)Service 還沒(méi)有運行將啟動(dòng)它)。當連接到一個(gè)Service 之后,還可以利用Service 提供的接口與它通信。就媒體播放器來(lái)說(shuō),還可以進(jìn)行暫停、重播等操作。

1.4 Content Provider

Android 應用程序能夠將它們的數據保存到文件、SQL 數據庫,甚至是任何有效的設備中。Content Provider 實(shí)現了應用數據與其他的應用程序的共享。Content Provider 類(lèi)實(shí)現一組標準的方法,能夠讓其他應用程序保存或讀取此ContentProvider處理的各種類(lèi)型數據。在A(yíng)ndroid 中,默認使用SQLite 作為系統數據庫,但使用方法略有不同。Android 中每一個(gè)應用程序都運行在各自的進(jìn)程中,當訪(fǎng)問(wèn)其他應用程序的數據時(shí),需要在不同的虛擬機之間傳遞數據,這樣操作起來(lái)會(huì )有些困難(正常情況下,不能讀取其他應用程序的數據庫文件)。ContentProvider 正是解決不同的應用包共享數據的工具。

2 天氣實(shí)況預報系統的具體實(shí)現

基于A(yíng)ndroid 平臺的智能手機訪(fǎng)問(wèn)服務(wù)器的主要技術(shù)是數據交互方法?;贏(yíng)ndroid 操作系統的天氣實(shí)況預報系統設計的核心是通過(guò)調用通信協(xié)議SOAP(Simple Object AccessProtocol)的接口,從Web Service 提供商中提取的數據信息,為客戶(hù)端服務(wù)。其基本功能是當用戶(hù)運行系統程序時(shí),在手機屏幕上顯示出中國的城市名稱(chēng),用戶(hù)單擊任意一個(gè)城市名,可獲得該城市的天氣實(shí)況預報信息。用戶(hù)也可以輸入城市名稱(chēng),點(diǎn)擊查詢(xún)獲得信息。CitiesWeather-Forecast 工程目錄結構及其源代碼文件如圖1所示。

2.1 Android平臺的用戶(hù)界面實(shí)現

Android 提供的可變化的用戶(hù)界面(UI)開(kāi)發(fā)模塊是基于XML 文件的。這些XML 文件放在工程/res/layout 下面。這個(gè)目錄可包含所有應用程序所需的非碼部分,比如圖片、字符串、xml 文件。當要使用到這些資源時(shí),在代碼目錄中打開(kāi)R.java文件即可。在XML 文件里編輯界面的代碼,實(shí)現起來(lái)不僅方便,使用時(shí)也會(huì )更加靈活。

在A(yíng)ndroid 程序設計中要用到一些基本的Android UI 元素,通過(guò)使用Views、View Groups 和layouts 可為Activity 創(chuàng )建功能性的、富有直觀(guān)力的UI.通常是使用Android SDK 中提供的一些控件,進(jìn)行布局、擴展和定制這些控件,并使用ViewGroups 去組合Views,創(chuàng )建由相互作用的子控件組成的原子的、重復利用的UI 元素。也可以創(chuàng )建自己的Views,來(lái)實(shí)現顯示數據和與用戶(hù)交互的新途徑;或使用一些繼承自View Group 的Layout 管理器來(lái)組織Android UI中的單個(gè)元素到屏幕上。

在一個(gè)Android 應用中,用戶(hù)界面由View 和View Group對象構建。View 與View Group 有很多種類(lèi),而它們都是View類(lèi)的子類(lèi)。View 對象是Android 平臺中用戶(hù)界面的基本單元。View 類(lèi)是widgets(工具)類(lèi)的父類(lèi),它們提供了諸如文本輸入框和按鈕之類(lèi)的UI 對象的完整實(shí)現。View Group 類(lèi)是Layouts(布局)類(lèi)的父類(lèi),它們提供了諸如流式布局、表格布局以及相對布局之類(lèi)的布局架構。

View 對象是一個(gè)數據體,它的屬性存儲了用于屏幕上一塊矩形區域的布局參數及內容。并負責它所轄的這個(gè)矩形區域之中所有測量、布局、焦點(diǎn)轉換、卷動(dòng)以及按鍵/觸摸手勢的處理。作為一個(gè)用戶(hù)界面對象,View 同時(shí)也擔任著(zhù)用戶(hù)交互關(guān)鍵點(diǎn)以及交互事件接受者的角色。天氣實(shí)況預報系統程序功能比較單一,其UI 也相對比較簡(jiǎn)單,只要有一個(gè)輸入框、一個(gè)查詢(xún)按鈕以及一個(gè)顯示所有中國城市信息的列表即可。為了建立Android 平臺的用戶(hù)界面,首先要在Package Explorer 窗口中展開(kāi)Layout 后新建。xml 文件,用來(lái)對窗口界面進(jìn)行布局,主要有系統運行的主配置文件main.xml 和result.xml.

Layout 是一類(lèi)特殊的ViewGroup 控件,它們本身沒(méi)有任何可顯示內容,存在的惟一原因就是其中的內部結構,能夠更好地擺放它的子控件。比如Linearlayout,可將子控件按水平或垂直方向按順序排列下去;Tablelayout,可以將子控件按照表格的形式,一枚枚放置好;Relativelayout 更靈活,可以設定各個(gè)控件之間的對齊和排列關(guān)系,適合定制復雜的界面。有了Layout 的存在,控件和控件之間不再是割裂地存在,而是更有機地結合在一起,設定起來(lái)也更為方便。在本實(shí)例的main.xml 文件中主要是添加一些界面的布局設置,例如如下代碼:

LinearLayout

android:orientation=horizontal

android:layout_width=fill_parent

android:layout_height=wrap_content

>

EditText android:id=@+id/cityText

android:layout_width=wrap_content

android:layout_height=wrap_content

android:text=@string/cityText/>

Button android:id=@+id/searchBtn

android:layout_width=wrap_content

android:layout_height=wrap_content

android:text=@string/searchBtn/>

/LinearLayout>

上述代碼生成了一個(gè)Linearlayout,定義了一個(gè)EditText 和Button,并且設置了相關(guān)的參數。在A(yíng)ndroid 中,控件最重要的大小屬性是width/height,開(kāi)發(fā)者可以指明控件的大小,控件的寬、高以及在屏幕中的顯示位置等,可以設定成為fill_parent 和wrap_content.另外,還可以設置相應的文本信息,并可通過(guò)android:text=@string/cityText/>進(jìn)行引用(string 文件存放在工程的res/values 中)。按照這種方法,還可以依據需要定義相應的布局控件,譬如定義用來(lái)呈現天氣實(shí)況信息的UI等。

2.2 創(chuàng )建中國城市列表數據

根據天氣預報系統功能需求分析,系統啟動(dòng)后,應在主界面上呈現出中國國內所有城市的列表數據,因此需要創(chuàng )建中國城市列表數據,包括獲取、解析城市列表數據,并在用戶(hù)界面上呈現出來(lái)。為此,需要解決的問(wèn)題是手機終端從Web 服務(wù)器獲取了所有類(lèi)型的數據之后,將這些數據進(jìn)一步交給Android 手機終端View 組件[4],在手機界面上顯示給用戶(hù)。

⑴ 獲取城市列表數據

Android 沒(méi)有提供Web Service 的組件庫,但可以通過(guò)修改在PC 或J2ME 上使用的開(kāi)源Web Service Java 庫作為AndroidWeb Servic 庫使用。kSOAP2(http://ksoap2.sourceforge.net)是一個(gè)在智能手機上的SOAP Web Service 客戶(hù)端包,可用于資源受限制的Java 環(huán)境如Applets 或J2ME 應用程序。在GoogleCode 上有一個(gè)項目ksoap2-android(http://code.google.com/p/ksoap2-android/)可用在A(yíng)ndroid 平臺上實(shí)現輕量級的SOAP 庫,即使用ksoap2-android 的API 來(lái)調用遠端Web Service 的服務(wù)。

因此需要在CitiesWeatherForecast.java 的onCreate()中進(jìn)行數據獲取的初始化工作。通過(guò)定義一個(gè)方法public ListString>getAllCitiesNAMEs()可獲得中國城市名稱(chēng)列表。也就是說(shuō),采用它提供的獲得全球各個(gè)國家城市的方法GetCitiesByCountry,通過(guò)http://www.webservicex.net/globalweather.asmx 上的WebService 可提供天氣預報服務(wù)。譬如,通過(guò)Constant.java 中的public class Constant{},設置SOAP Action 要調用的方法名、命名空間以及Web Service URL值,其源代碼為:

public static final String SOAP_ACTION=

http://www.webserviceX.NET/GetCitiesByCountry;

public static final String METHOD_NAME=

GetCitiesByCountry;

public static final String SOAP_ACTION2=

http://www.webserviceX.NET/GetWeather;

public static final String METHOD_NAME2=GetWeather;

public static final String NAMESPACE=

http://www.webserviceX.NET;

public static final String URL=

http://www.webservicex.net/globalweather.asmx;

然后在WebServiceCaller.java 中實(shí)例化一個(gè)SoapSerializationEnvelope對象,設置SoapObject 的命名空間、方法名、參數等;并通過(guò)實(shí)例化一個(gè)AndroidHttpTransport 對象來(lái)調用WebService,并獲得xml 字符串數據,其代碼段如下:

AndroidHttpTransport androidHttpTransport=

new AndroidHttpTransport (Constant.URL);

try {

androidHttpTransport.call(soapAction, envelope);

Object result=envelope.getResponse();

xmlStr=result.toString();

} catch(Exception e) {

e.printStackTrace();

}

⑵ 解析數據列表

Android 操作系統對xml 字符串數據的操作功能很強,提供了dom、sax 以及xmlpul 3 種方式。Android SDK 提供了android.sax 包以方便SAX Handler 的開(kāi)發(fā),可用來(lái)解析xml 結果字符串。在本設計實(shí)例的CitiesWeatherForecast.java 文件中,解析xml 數據時(shí),先通過(guò)RootElement root=new RootElement(NewDataSet)獲得xml 數據的根節點(diǎn);然后再尋找其子節點(diǎn)直到找到City 子節點(diǎn),并設置一個(gè)監聽(tīng)器setEndTextElementListener()來(lái)獲得City 子節點(diǎn)的值;最后使用org.xml.sax 的SAXParser 來(lái)解析xml 數據,把數據存入ListString>并返回:

SAXParserFactory factory=SAXParserFactory.newInstance();

SAXParser parser=factory.newSAXParser();

XMLReader xmlreader=parser.getXMLReader();

xmlreader.setContentHandler(root.getContentHandler());

InputSource is=new InputSource

(new StringBufferInputStream(xmlStr));

xmlreader.parse(is);

⑶ 在UI上呈現城市列表數據

當獲得ListString>類(lèi)型的數據之后,就可以把它綁定到main.xml 定義的ListView 組件上,然后使用ListActivity 呈現列表數據。在CitiesWeatherForecast.java 中的代碼段為:

ListString> cityList=getAllCitiesNames();

setListAdapter(new ArrayAdapterString>(this,

android.R.layout.simple_list_item_1, cityList));

即使用方法setListAdapter()把一個(gè)ListActivity 填充進(jìn)去。

2.3 城市天氣實(shí)況預報系統的調試

城市天氣實(shí)況預報系統的測試結果如下。在Eclipse 的Package Explorer 窗口中用鼠標右鍵選擇CitiesWeatherForecast工程名,在彈出的窗口中選擇Run As→Android Application安裝該應用程序到Android 模擬器并啟動(dòng)它。然后單擊所要查詢(xún)的城市名稱(chēng)列表項,稍等片刻便會(huì )顯示出該城市的天氣實(shí)況信息。也可以在文本框中直接輸入所要查詢(xún)的城市名稱(chēng),單擊Search同樣會(huì )獲得相應城市的天氣預報信息。

3 結束語(yǔ)

Android 平臺具有極大的開(kāi)放性和兼容性,并且本身大量使用了開(kāi)源代碼庫,深為開(kāi)發(fā)人員所喜愛(ài)。Android 智能手機應用程序的開(kāi)發(fā)涉及了它的整個(gè)體系結構,是一項非常復雜的工程。本文在介紹基于A(yíng)ndroid 平臺的應用程序設計原理的基礎上,提出了Android 用戶(hù)界面設計、獲取并解析城市列表數據的一種方法,給出了在用戶(hù)界面上呈現數據的原理與設計過(guò)程,最后通過(guò)模擬器進(jìn)行了應用程序的調試。當然,基于A(yíng)ndroid 平臺的開(kāi)發(fā)技術(shù)還需要進(jìn)一步完善,需要在日后的工作中不斷探索、研究,以建立實(shí)用的城市天氣實(shí)況預報系統。



關(guān)鍵詞: 智能手機 天氣預報 Android

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>