0 引言
2007 年11 月由Google 牽頭,有30 多家移動(dòng)技術(shù)和無線應(yīng)用領(lǐng)域領(lǐng)先企業(yè)組成的開放手機(jī)聯(lián)盟( Open Handset Alliance) 發(fā)布了其智能手機(jī)平臺(tái)---Android.Android 是一個(gè)開放,、自由的移動(dòng)終端平臺(tái),,它是由操作系統(tǒng)、中間件,、用戶界面、應(yīng)用軟件組成,,同時(shí)其開放性保證該平臺(tái)不存在任何阻礙移動(dòng)產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙,。開發(fā)人員在該平臺(tái)開發(fā)的應(yīng)用程序是使用Java 語言編寫的,在Dalvik 虛擬機(jī)上運(yùn)行的,。Android 的底層是以開放性的Linux Kernel為其架構(gòu),,也可以理解為Google 推出的手機(jī)操作系統(tǒng)和相關(guān)軟件的總稱[1].
Android 是一套真正意義上的開放性移動(dòng)設(shè)備綜合平臺(tái),它包括操作系統(tǒng),、中間件和一些關(guān)鍵的平臺(tái)應(yīng)用,。Android 最大特點(diǎn)在于它是一個(gè)開放的體系架構(gòu),具有非常好的開發(fā)和調(diào)試環(huán)境,,而且還支持各種可擴(kuò)展的用戶體驗(yàn),,Android 里面具有非常豐富的圖形系統(tǒng)、對(duì)多媒體的支持功能和非常強(qiáng)大的瀏覽器[2].
Android 平臺(tái)的開放性等特點(diǎn)既能促進(jìn)技術(shù)( 包括平臺(tái)自身) 的創(chuàng)新,,又有助于降低開發(fā)成本,,還可以使運(yùn)營商能非常方便地制定特色化的產(chǎn)品,因此,,它具有很大的市場發(fā)展?jié)摿Α?/p>
1 Android 軟件平臺(tái)的構(gòu)成
Android 軟件平臺(tái)主要由5 部分構(gòu)成,,它們分別是: 關(guān)鍵應(yīng)用程序,、應(yīng)用程序框架和組件、C /C ++ 函數(shù)庫,、Java 程序運(yùn)行環(huán)境,、優(yōu)化了的Linux 內(nèi)核。
(1) 關(guān)鍵應(yīng)用程序,。
Android 本身會(huì)附帶一些核心的應(yīng)用程序,,包括E-mail 客戶端、短信程序,、日歷,、地圖、瀏覽器,、通訊錄等,,目前所有的應(yīng)用程序都是用Java 語言開發(fā)的。
更多有特色的Android 應(yīng)用程序還有待于廣大開發(fā)者共同參與開發(fā),。
(2) 應(yīng)用程序框架及組件,。
Android 應(yīng)用程序開發(fā)基于框架和組件。Android 本身已在其框架中提供了許多組件供應(yīng)用程序調(diào)用,,開發(fā)者也可在開發(fā)應(yīng)用程序時(shí)順帶開發(fā)新的組件,,并將該組件放入應(yīng)用程序框架中,以供自己和其它應(yīng)用程序調(diào)用,。
(3) Android 運(yùn)行時(shí)庫和其它庫層,。
Android 應(yīng)用程序框架之下是一套C /C ++ 函數(shù)庫,它們服務(wù)于Android 應(yīng)用程序組件,,其功能通過組件間接提供給開發(fā)者,。這些函數(shù)庫包括: 標(biāo)準(zhǔn)C函數(shù)庫、多媒體庫,、瀏覽器引擎( 集成了Web 瀏覽器和Internet 安全的SSL 和WebKit) ,、2D、3D 圖形庫及SQLite 引擎和外觀管理器等,。這一層也提供了程序運(yùn)行的環(huán)境,。Android 的Java 程序運(yùn)行環(huán)境包含一組Java 核心函數(shù)庫及Dalvik 虛擬機(jī),它們有效地優(yōu)化了Java 程序的運(yùn)行過程,。
(4) Linux 內(nèi)核,。
Android 系統(tǒng)平臺(tái)基于優(yōu)化了的Linux 內(nèi)核,它提供諸如硬件驅(qū)動(dòng)程序( USB,、藍(lán)牙,、顯示屏等) 、內(nèi)存管理,、進(jìn)程管理,、電源管理等服務(wù),,同時(shí)也是手機(jī)軟、硬件的連接層,。
2 Android 程序開發(fā)的基本組件
Android 有如下幾大基本組件: Activity,、Service、CONtent Provider 和BroadcaST Receiver,。
Activity 是Android 最基本的應(yīng)用程序組件,。任何一個(gè)Android 應(yīng)用程序都可以看作一組任務(wù),這里每一個(gè)任務(wù)就可以稱作一個(gè)Activity.在應(yīng)用程序中,,一個(gè)Activity 通常就是一個(gè)單獨(dú)的屏幕,,用于呈現(xiàn)數(shù)據(jù)和與用戶進(jìn)行交互,每個(gè)屏幕可以有一個(gè)或多個(gè)組件布局,。
而每一個(gè)活動(dòng)又是一個(gè)單獨(dú)的類,,每一個(gè)這樣的類都要將Activity 作為父類。一個(gè)Activity 可以切換到新的Activity,也可以返回前一個(gè)Activity.Android 通過使用Intent 類來實(shí)現(xiàn)Activity 的切換,。例如,,一個(gè)簡單的游戲程序可以分為5 個(gè)Activity: 啟動(dòng)畫面、主菜單界面,、游戲主界面,、高分辨和幫助界面。
Service,即"服務(wù)"的意思,,相當(dāng)于沒有界面的Activity.應(yīng)用程序的Service 可以不需要用戶直接參與而長時(shí)間運(yùn)行,。典型的例子就是音樂播放器。在一個(gè)音樂播放器程序中有多個(gè)Activity,它們分別實(shí)現(xiàn)了歌曲的選擇和播放等功能,。然而,,音樂重放這個(gè)功能并沒有對(duì)應(yīng)的Activity,它通過Service 來實(shí)現(xiàn)。
音樂播放器程序啟動(dòng)一個(gè)Service,它可以在后臺(tái)保持音樂的不斷播放,。應(yīng)用程序還可以連接到一個(gè)Service.當(dāng)Service 啟動(dòng)后,還可以借助Service 提供的接口與它進(jìn)行通信,。
Android 應(yīng)用程序可以使用文件,、SQL 數(shù)據(jù)庫等各種存儲(chǔ)系統(tǒng)來保存數(shù)據(jù)。但是,,如果想實(shí)現(xiàn)不同應(yīng)用之間的數(shù)據(jù)共享,,就需要用到Content Provider.
Content Provider 提供了一套標(biāo)準(zhǔn)的訪問接口,以方便其他應(yīng)用程序?qū)?shù)據(jù)進(jìn)行訪問,、操作,。
在實(shí)際應(yīng)用中,常常需要等待系統(tǒng)或者其它應(yīng)用發(fā)出一道指令,。在Android 中,,充分考慮了這類需求,,于是就有了Broadcast Receiver 這樣的一個(gè)組件。
每個(gè)Broadcast Receiver 都可以接收一種或若干種Intent作為觸發(fā)事件,,當(dāng)一個(gè)Broadcast Receiver 被觸發(fā)后,,系統(tǒng)就會(huì)通知相應(yīng)的程序。
3 Android 多媒體API 及開發(fā)方法
多媒體---無論是圖像,、視頻還是聲音,,都早已成為了移動(dòng)設(shè)備受到廣泛歡迎的主要原因。而今,,手機(jī)設(shè)備很少會(huì)沒有攝像頭的,,而且隨著技術(shù)的日益更新,越來越多的設(shè)備會(huì)擁有更為專業(yè)的視頻性能,。用戶經(jīng)常使用手機(jī)來拍攝和瀏覽照片,,錄制聲音和觀看視頻。
3. 1 Android 提供的多媒體開發(fā)框架
Android 軟件開發(fā)包提供了一系列的方法來處理音視頻媒體,,包括對(duì)于多種媒體類型和格式的支持,。
單獨(dú)的Android 設(shè)備和開發(fā)人員可以擴(kuò)展其支持的媒體格式列表。
Open Core 是Android 多媒體開發(fā)的核心,,所有Android 平臺(tái)的音頻,、視頻的采集以及播放等操作都是通過它來實(shí)現(xiàn)的。程序員可以通過Open Core 方便快速地開發(fā)出想要的多媒體應(yīng)用程序,,例如: 錄音,、播放、回放,、視頻會(huì)議等,。Open Core 和框架圖如圖1 所示。
圖1 Open Core 框架圖
由圖1 可以看出,,Open Core 支持的格式有MPEG4,、H. 263、MP3,、AAC,、JPG 等。Open Core 多媒體框架有一套通用可擴(kuò)展的接口,,針對(duì)第三方的多媒體編解碼器,,輸入、輸出設(shè)備等,。
3. 2 Open Core 的主要多媒體類與接口
Open Core 主要提供了如下幾個(gè)多媒體類:
( 1) MediaPlayer 類可以用于播放音頻,、視頻和流媒體,它包含了Audio 和Video 的播放功能,在Android的界面上,,音頻和視頻的播放都是調(diào)用Media-Player 實(shí)現(xiàn)的,。它可以獲得媒體文件和各種屬性和當(dāng)前的播放狀態(tài),并可以開始和停止文件的播放,。
( 2) MediaRecorder 類用來進(jìn)行媒體采樣,,包括音頻和視頻。MediaRecorder 作為狀態(tài)機(jī)運(yùn)行,,需要設(shè)置不同的參數(shù),,如源格式和源設(shè)備。設(shè)置后可執(zhí)行任意長度的錄制,,直到用戶停止,。
( 3) VideoView 類主要用來顯示一個(gè)視頻文件,它是SurfaceView 類的一個(gè)子類,,且實(shí)現(xiàn)了MediaPlayerControl接口,。
( 4) Camera 類用來處理系統(tǒng)中與相機(jī)相關(guān)的事件,Camera 是一個(gè)專門用來連接和斷開相機(jī)服務(wù)的類,。
Open Core 在使用過程中的調(diào)用關(guān)系如圖2所示,。
圖2 使用Open Core 的調(diào)用關(guān)系圖
4 示例程序: 播放器
4. 1 布局設(shè)計(jì)
Android 是通過布局( Layout) 來定義UI( 用戶界面) 的。一般視圖( View) 可以直接在布局的XML 里聲明,。XML 文件如下所示:
< ? xml version = ″1. 0″encoding = ″utf-8?″ >
-< AbsoluteLayout
xmlns: android = ″http: / /schemas. android. com/apk /res /android″
android: orientation = ″vertical″
android: layout_width = ″fill_parent″
android: layout_height = ″fill_parent″ >
< ListView
android: id = ″@ id /android: list″
android: layout_width = ″fill_parent″
android: layout_height = ″fill_parent″
android: layout_weight = ″1″
android: drawSelectorOnTop = ″false″ / >
< ImageButton
android: id = ″@ + id /LastImageButton″
android: layout_width = ″wrap_content″
android: layout_height = ″wrap_content″
android: layout_x = ″10px″
android: layout_y = ″170px″
android: src = ″@ drawable /last″ / >
?。?以下4 個(gè)BUTTON 同上,橫坐標(biāo)有變化,。)
< /AbsoluteLayout >
這個(gè)簡單的播放器只有一個(gè)界面,,可以顯示播放列表和對(duì)音樂的播放進(jìn)行各種操作。
4. 2 程序框架設(shè)計(jì)
在這唯一的Activity 類的界面生成消息響應(yīng)方法中,,先定義幾個(gè)操作按鈕,,然后就要?jiǎng)?chuàng)建整個(gè)程序的主對(duì)象---mMediaPlayer 了。語句如下:
public MediaPlayer mMediaPlayer = null;
這是一個(gè)MediaPlayer 類型的對(duì)象,,它的功能前面已經(jīng)介紹過了,,這里不再贅述。之后要?jiǎng)?chuàng)建的就是其它的組件,,包括播放列表,、歌曲的路徑以及索引了。
private List < String > mMusicList = new ArrayList < String >( ) ; / /播放列表
private int currentListItme = 0; / /索引
private static final String MUSIC_PATH = new String( ″ /sdcard/″) ; / /歌曲的路徑
4. 3 程序核心代碼
接下來設(shè)置這些ImageButton 的事件監(jiān)聽,。
mStartImageButton. setOnClickListener(
new ImageButton. OnClickListener( )
{
@ Override public void onClick( View v)
{
playMusic( MUSIC_PATH + mMusi-cList. get( currentListItme)
) ;
}
} ) ;
這是"開始播放"按鈕的事件監(jiān)聽,。這里是調(diào)用了一個(gè)playMusic( ) 方法來實(shí)現(xiàn)音樂文件的播放的,。
在playMusic( ) 方法中,先調(diào)用mMediaPlayer 的reset( ) 方法,,重置MediaPlayer 到它的正常狀態(tài),。然后調(diào)用setDataSource( string) 方法設(shè)置好音樂文件的數(shù)據(jù)源,,再連續(xù)調(diào)用prepare( ) 和start( ) 方法,MediaPlayer將開始播放音樂文件,。
接下來,,要設(shè)置一個(gè)OnCompletionListener ( setOnCompletionListener( new OnCompletionListener ) ) ,在歌曲結(jié)束的時(shí)候,onCompletion( MediaPlayer) 會(huì)被調(diào)用,,這樣就可以設(shè)置為自動(dòng)播放下一曲目,。代碼如下。
mMediaPlayer. setOnCompletionListener(
new OnCompletionListener( )
{
public void onCompletion( MediaPlayer arg0)
{
nextMusic( ) ; / /播放下一曲
}
} ) ;
其它方法與上面方法類似,,在"停止"按鈕的事件響應(yīng)方法里,,要調(diào)用mMediaPlayer 的isPlaying( ) 方法來判斷播放器是否正在播放,如果正在播放則調(diào)用reset( ) 方法直接重置播放器即可,。暫停則可以調(diào)用mMediaPlayer 的pause( ) 方法,,再次開始播放則調(diào)用start( )。
5 結(jié)束語
Android 手機(jī)應(yīng)用程序開發(fā)需要著眼于它的整個(gè)體系構(gòu)架,,這是一項(xiàng)復(fù)雜的工程,。本文先是介紹并分析了Android 系統(tǒng)的層次架構(gòu),并在此基礎(chǔ)上介紹了Android 應(yīng)用程序開發(fā)的相關(guān)技術(shù)和基本的開發(fā)流程,。接下來介紹了Android 為開發(fā)人員提供的簡單,、易用的多媒體開發(fā)組件MediaPlayer、MediaRecorder等類,。最后用具體的應(yīng)用程序簡要說明了Android多媒體應(yīng)用程序的開發(fā)方法,。Android 具有極大的開放性和兼容性,相信廣大開發(fā)者可以借助AndroidSDK 提供的強(qiáng)大技術(shù)支持,,開發(fā)出豐富多彩,、極具個(gè)性的移動(dòng)應(yīng)用。