0 引言
為了讓智能手機用戶能夠隨時隨地查詢互聯(lián)網(wǎng)所提供的服務(wù),一種高效的辦法就是將應(yīng)用系統(tǒng)的功能拓展到手機終端,,讓手機能通過移動網(wǎng)和互聯(lián)網(wǎng)訪問Web 網(wǎng)站并處理各項業(yè)務(wù),。Android 系統(tǒng)是Google 公司開發(fā)的一個開源手機操作系統(tǒng),它包括了操作系統(tǒng),、用戶界面和應(yīng)用程序,,即智能手機工作所需的全部軟件。Android 的最大特點是它的開放性體系架構(gòu),,不僅具有非常好的開發(fā),、調(diào)試環(huán)境,而且還具有各種可擴展的設(shè)施,,包括豐富的圖形組件,、多媒體支持功能和強大的瀏覽器,而且已有許多比較成熟的應(yīng)用案例,。
本文提出了智能手機天氣實況預(yù)報系統(tǒng)的一種設(shè)計實現(xiàn)方法,,供開發(fā)者參考。
1 Android應(yīng)用程序設(shè)計原理
一個Android 應(yīng)用程序,,通常由AcTIvity,、Intent Receiver、Service,、CONtent Provider 四種功能組件構(gòu)成,。但是,并不是每一個Android 應(yīng)用程序都需要用到這四種功能組件,,而是只需上述四種功能組件的某些組合,。
1.1 Activity
Activity 是最基本的Android 應(yīng)用程序組件。大多數(shù)應(yīng)用由多個屏幕組成,,一個Activity 通常則是一個單獨的屏幕,。每一個Activity 都被實現(xiàn)為一個獨立的類,并且從Activity 基類中繼承而來,。Activity 類將會顯示由視圖控件組成的用戶接口,,并對事件做出響應(yīng),。Android 使用Intent 這個特殊類,實現(xiàn)在屏幕與屏幕之間移動,。通過解析各種Intent,從一個屏幕導(dǎo)航到另一個屏幕是很簡單的,。當(dāng)向前導(dǎo)航時,Activity 將會調(diào)用STartActivity(Intent myIntent)方法,,然后,,系統(tǒng)會在所有安裝的應(yīng)用程序中所定義的IntentFilter 中查找,找到最匹配myIntent的和Intent 對應(yīng)的Activity.新的Activity 接收到myIntent 的通知后,,開始運行,。當(dāng)startActivity 方法被調(diào)用時將觸發(fā)解析myIntent 的動作。這個機制具有兩點優(yōu)勢:一是能夠重復(fù)利用從其他組件中以Intent 形式產(chǎn)生的一個請求,;二是Activity 可以在任何時候被一個具有相同IntentFilter 的新Activity 取代,。
1.2 Intent Receiver
通過Intent Receiver 實現(xiàn)的應(yīng)用能夠?qū)σ粋€外部的事件作出響應(yīng)。Intent Receiver 在AndroidManifest.xml 中注冊,,也可以在代碼中使用Context.registerReceiver()進行注冊,。當(dāng)一個IntentReceiver 被觸發(fā)時,應(yīng)用不必對請求調(diào)用Intent Receiver,系統(tǒng)會在需要的時候啟動應(yīng)用,。各種應(yīng)用還可以通過使用Context.
brOAdcastIntent()將它們自己的Intent Receiver廣播給其他應(yīng)用程序,。
1.3 Service
Service 是一段長生命周期的、沒有用戶界面的程序,。例如媒體播放器這個Activity 會使用Context.startService()來啟動一個Service,從而可以在后臺播放音樂,。同時,系統(tǒng)也將保持這個Service 一直執(zhí)行,,直到Service 運行結(jié)束,。系統(tǒng)可通過使用Context.bindService()方法,連接到一個Service 上(如果這個Service 還沒有運行將啟動它),。當(dāng)連接到一個Service 之后,,還可以利用Service 提供的接口與它通信。就媒體播放器來說,,還可以進行暫停,、重播等操作。
1.4 Content Provider
Android 應(yīng)用程序能夠?qū)⑺鼈兊臄?shù)據(jù)保存到文件,、SQL 數(shù)據(jù)庫,,甚至是任何有效的設(shè)備中。Content Provider 實現(xiàn)了應(yīng)用數(shù)據(jù)與其他的應(yīng)用程序的共享,。Content Provider 類實現(xiàn)一組標(biāo)準(zhǔn)的方法,,能夠讓其他應(yīng)用程序保存或讀取此ContentProvider處理的各種類型數(shù)據(jù)。在Android 中,默認(rèn)使用SQLite 作為系統(tǒng)數(shù)據(jù)庫,,但使用方法略有不同,。Android 中每一個應(yīng)用程序都運行在各自的進程中,當(dāng)訪問其他應(yīng)用程序的數(shù)據(jù)時,,需要在不同的虛擬機之間傳遞數(shù)據(jù),這樣操作起來會有些困難(正常情況下,,不能讀取其他應(yīng)用程序的數(shù)據(jù)庫文件),。ContentProvider 正是解決不同的應(yīng)用包共享數(shù)據(jù)的工具。
2 天氣實況預(yù)報系統(tǒng)的具體實現(xiàn)
基于Android 平臺的智能手機訪問服務(wù)器的主要技術(shù)是數(shù)據(jù)交互方法,?;贏ndroid 操作系統(tǒng)的天氣實況預(yù)報系統(tǒng)設(shè)計的核心是通過調(diào)用通信協(xié)議SOAP(Simple Object AccessProtocol)的接口,從Web Service 提供商中提取天氣預(yù)報的數(shù)據(jù)信息,,為客戶端服務(wù),。其基本功能是當(dāng)用戶運行天氣預(yù)報系統(tǒng)程序時,在手機屏幕上顯示出中國的城市名稱,,用戶單擊任意一個城市名,,可獲得該城市的天氣實況預(yù)報信息。用戶也可以輸入城市名稱,,點擊查詢獲得天氣預(yù)報信息,。CitiesWeather-Forecast 工程目錄結(jié)構(gòu)及其源代碼文件如圖1所示。
2.1 Android平臺的用戶界面實現(xiàn)
Android 提供的可變化的用戶界面(UI)開發(fā)模塊是基于XML 文件的,。這些XML 文件放在工程/res/layout 下面,。這個目錄可包含所有應(yīng)用程序所需的非碼部分,比如圖片,、字符串,、xml 文件。當(dāng)要使用到這些資源時,,在代碼目錄中打開R.java文件即可,。在XML 文件里編輯界面的代碼,實現(xiàn)起來不僅方便,,使用時也會更加靈活,。
在Android 程序設(shè)計中要用到一些基本的Android UI 元素,通過使用Views,、View Groups 和layouts 可為Activity 創(chuàng)建功能性的,、富有直觀力的UI.通常是使用Android SDK 中提供的一些控件,進行布局,、擴展和定制這些控件,,并使用ViewGroups 去組合Views,創(chuàng)建由相互作用的子控件組成的原子的、重復(fù)利用的UI 元素。也可以創(chuàng)建自己的Views,來實現(xiàn)顯示數(shù)據(jù)和與用戶交互的新途徑,;或使用一些繼承自View Group 的Layout 管理器來組織Android UI中的單個元素到屏幕上,。
在一個Android 應(yīng)用中,用戶界面由View 和View Group對象構(gòu)建,。View 與View Group 有很多種類,,而它們都是View類的子類。View 對象是Android 平臺中用戶界面的基本單元,。View 類是widgets(工具)類的父類,,它們提供了諸如文本輸入框和按鈕之類的UI 對象的完整實現(xiàn)。View Group 類是Layouts(布局)類的父類,,它們提供了諸如流式布局,、表格布局以及相對布局之類的布局架構(gòu)。
View 對象是一個數(shù)據(jù)體,,它的屬性存儲了用于屏幕上一塊矩形區(qū)域的布局參數(shù)及內(nèi)容,。并負(fù)責(zé)它所轄的這個矩形區(qū)域之中所有測量、布局,、焦點轉(zhuǎn)換,、卷動以及按鍵/觸摸手勢的處理。作為一個用戶界面對象,,View 同時也擔(dān)任著用戶交互關(guān)鍵點以及交互事件接受者的角色,。天氣實況預(yù)報系統(tǒng)程序功能比較單一,其UI 也相對比較簡單,,只要有一個輸入框,、一個查詢按鈕以及一個顯示所有中國城市信息的列表即可。為了建立Android 平臺的用戶界面,,首先要在Package Explorer 窗口中展開Layout 后新建,。xml 文件,用來對窗口界面進行布局,,主要有系統(tǒng)運行的主配置文件main.xml 和result.xml.
Layout 是一類特殊的ViewGroup 控件,,它們本身沒有任何可顯示內(nèi)容,存在的惟一原因就是其中的內(nèi)部結(jié)構(gòu),,能夠更好地擺放它的子控件,。比如Linearlayout,可將子控件按水平或垂直方向按順序排列下去;Tablelayout,可以將子控件按照表格的形式,,一枚枚放置好,;Relativelayout 更靈活,可以設(shè)定各個控件之間的對齊和排列關(guān)系,,適合定制復(fù)雜的界面,。有了Layout 的存在,,控件和控件之間不再是割裂地存在,而是更有機地結(jié)合在一起,,設(shè)定起來也更為方便,。在本實例的main.xml 文件中主要是添加一些界面的布局設(shè)置,例如如下代碼:
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cityText"/>