基于Android的應(yīng)用軟件開發(fā)實例初探的設(shè)計與開發(fā)_第1頁
基于Android的應(yīng)用軟件開發(fā)實例初探的設(shè)計與開發(fā)_第2頁
基于Android的應(yīng)用軟件開發(fā)實例初探的設(shè)計與開發(fā)_第3頁
基于Android的應(yīng)用軟件開發(fā)實例初探的設(shè)計與開發(fā)_第4頁
基于Android的應(yīng)用軟件開發(fā)實例初探的設(shè)計與開發(fā)_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

我們的愛情,我們的理想,我們的未來,我們的成長,我們的幸福我們的愛情,我們的理想,我們的未來,我們的成長,我們的幸?;贏ndroid的應(yīng)用軟件開發(fā)實例初探指導(dǎo)教師:xxxxxx項目作者:xxxxxx2010年3月15日目錄TOC\o"1-4"\h\u481.引言 1323532.Android應(yīng)用軟件開發(fā)基礎(chǔ) 2122572.1Android應(yīng)用軟件開發(fā)的語言 276982.1.1Simple 2303642.1.2Scala 2169202.1.3Java 2258642.2搭建開發(fā)環(huán)境 276792.2.1計算機(jī)配置 2143312.2.2下載SDK初始包 3237622.2.3安裝ADT 345072.2.4設(shè)置Eclipse 3220842.3ADT的使用 3144422.3.1創(chuàng)建一個Android項目 3138262.3.2編譯運行一個項目 4296482.4Android平臺應(yīng)用程序基礎(chǔ) 5283112.4.1概要 566252.4.2Android應(yīng)用程序組件 5237002.4.3AndroidManifest.xml文件 7165013.音樂播放器實例 7255613.1創(chuàng)建項目 8214443.2設(shè)計界面 9246213.2.1準(zhǔn)備圖片 9100233.2.2準(zhǔn)備字符串資源 10193343.2.3設(shè)計程序的窗口布局 11309003.3編寫Java代碼 12204053.4運行、調(diào)試程序 15263093.5打包發(fā)布程序 16261924.參考資料 1637555.附錄 172755.1song_item.xml的代碼 1715725.2songlist.xml的代碼 17179275.3strings.xml文件代碼 18115925.4AndroidManifest.xml文件代碼 1815915.5MusicPlayer.java的代碼 181.引言Android系統(tǒng)是由Google在2007年發(fā)布的一個開源平臺,包括操作系統(tǒng)、中間件,以及一些關(guān)鍵應(yīng)用。由于Android系統(tǒng)有開源、免費、易于移植的特點,以及Google等廠商的大力支持,Android在短短幾年時間內(nèi)得到了飛速發(fā)展。2008年HTC推出第一款A(yù)ndroid系統(tǒng)機(jī)型DreamG1之后,各廠商都紛紛跟進(jìn),推廣速度十分喜人。另外還有一些廠家利用Android易于移植的特性,開發(fā)了或正在開發(fā)基于Android系統(tǒng)的電子書閱讀器、平板電腦、MP4、MID等智能終端。可以預(yù)見,Android的應(yīng)用范圍將越來越廣,學(xué)習(xí)Android的開發(fā)也一定會有越來越大的用武之地。在該課程設(shè)計中,我通過學(xué)習(xí)Android的API,開發(fā)了一個簡易的音樂播放器,實現(xiàn)了最基本的功能。通過這一實例,我們也能從中一窺Android應(yīng)用的開發(fā)流程。2.Android應(yīng)用軟件開發(fā)基礎(chǔ)2.1Android應(yīng)用軟件開發(fā)的語言2.1.1SimpleSimple是Google于2009年7月推出的一種新的語言,其目的就是簡化Android開發(fā)的難度,提供一種類似于VisualBasic的編程體驗,在設(shè)計時就為Android的開發(fā)作了許多考慮。它的平臺是完全開源的,但是目前Simple的資料較為貧乏,不便于學(xué)習(xí)。2.1.2ScalaScala是一種特色鮮明的語言,它和Java一樣運行于JVM之上,但是卻同Java有許多設(shè)計理念上的區(qū)別。它提供一種類似函數(shù)式編程的方式,同時也提供了對面向?qū)ο蟮闹С?,這也是一種新生的語言,應(yīng)用范圍正變得越來越廣,在編寫運行于多核處理器的程序時具有一定優(yōu)勢。之所以可以用Scala編寫Android的應(yīng)用程序,根本原因是Scala和Java編寫的程序一樣運行于JVM上。但是光這一點還不夠,編寫Scala程序所用到的Scala庫得作一些改動,已經(jīng)有人將可用于Android開發(fā)的Scala庫制作好了,開發(fā)人員可以直接使用修改后的Scala庫代替原先的Scala標(biāo)準(zhǔn)庫。我們用Scala編寫的程序,實際上是先被Scala的編譯器編譯成了Java的class文件,然后再由Androiddex編譯器將Javaclass文件編譯成Android設(shè)備里的JVM中可以運行的dex文件。2.1.3JavaJava是Android上的主流開發(fā)語言,各種支持也最完善。Android發(fā)布的API和SDK也都主要是面向Java開發(fā)人員的。我們的播放器實例也是用Java開發(fā)的。2.2搭建開發(fā)環(huán)境2.2.1計算機(jī)配置開發(fā)Android應(yīng)用所用到的開發(fā)工具較占內(nèi)存,尤其是模擬器。官方并未給出最低配置要求,根據(jù)個人實際體會,在本人IntelT2080雙核及1G內(nèi)存的情況,基本上能流暢使用。另外還需有600MB以上的剩余磁盤空間(官方文檔中的說明)。2.2.2下載SDK初始包初始包中有開發(fā)Android程序所要用到的工具,這些工具包括了從編譯到運行Android應(yīng)用程序所需要的各種工具。因此,事實上最基本的開發(fā)環(huán)境至此就已經(jīng)搭建完整。(SDK的下載地址為/sdk/index.html,本來官方網(wǎng)站為,但是經(jīng)常被封鎖,該鏈接更為穩(wěn)定。)2.2.3安裝ADT按照2.2.2安裝完SDK初始包后,就可以開始開發(fā)Android應(yīng)用程序了,但是為了更高效地進(jìn)行開發(fā),Android團(tuán)隊推出了AndroidDevelopmentTools(ADT)。ADT是目前開發(fā)Android應(yīng)用最有效的工具,它是一個Eclipse插件,支持Eclipse3.4及3.4以上的版本。以Eclipse3.5(Galileo)為例,安裝過程如下:打開Eclipse,選擇Help>InstallNewSoftare。在AvailableSoftware對話框中,點擊Add...。在彈出的AddSite對話框中,任意填寫一個名字到Name一欄。在Location一欄,則填入這一URL:“/android/eclipse/”,然后確認(rèn)返回。(注意:如果在后續(xù)的步驟中發(fā)現(xiàn)無法安裝插件,可以試著把URL中的https換成http。)返回到AvailableSoftware窗口后,就能看到列表中出現(xiàn)了"DeveloperTools",選中它前面的復(fù)選框,再點擊“Next”,就會開始下載安裝ADT的各種組件了。安裝完畢后將彈出窗口顯示ADT相關(guān)的各種信息以及許可協(xié)議,點擊“Finish“即可完成安裝。重新啟動Eclipse。2.2.4設(shè)置Eclipse選擇"Window>Preferences..."打開偏好設(shè)置從左側(cè)邊欄中選擇"Android"一欄。單擊SDKLocation一欄邊的Browse按鈕,選擇剛剛下載的SDK保存的路徑。點擊Apply,OK,設(shè)置生效。至此,Android的開發(fā)環(huán)境就已經(jīng)搭建完畢,可以使用了。2.3ADT的使用2.3.1創(chuàng)建一個Android項目選擇File>New>Project點擊Android>AndroidProject,然后點擊Next在彈出的對話框內(nèi),依照提示,輸入必要的內(nèi)容:輸入ProjectName,整個項目的代碼將自動保存在以名字命名的文件夾下。在Contents選項中,選定Createnewprojectinworkspace以及項目保存的位置。在Target選項中,從列出的Android目標(biāo)平臺中選擇一個或多個。編譯時將會編譯成所選目標(biāo)平臺上的程序。在Properties選項中,填寫必要的內(nèi)容:a)在Applicationname處輸入應(yīng)用的名稱。該名稱將會作為標(biāo)題顯示在手機(jī)中。b)在Packagename處輸入包的名稱c)選擇是否需要創(chuàng)建一個Activity(關(guān)于Activity的概念將在后面的章節(jié)中講述)。大多數(shù)應(yīng)用程序都需要有至少一個Activity。如果選擇了創(chuàng)建,那么就還需要填寫主Activity的名稱。d)輸入MinSDKVersion,ADT會把該設(shè)置寫入Manifest.xml文件中(下文將介紹該文件的作用)。這一選項是用于判斷該應(yīng)用程序是否能兼容于某版本的Android系統(tǒng)。由于推出時間不久,Android的更新速度十分快,現(xiàn)已發(fā)布了1.0,1.1,1.5,1.6,2.0,2.0.1,2.1這幾個版本。市面上現(xiàn)有的大部分Android終端都是基于1.5(APILevel為3)以后的版本,少數(shù)最新款的設(shè)備使用了2.0以后的版本。因此,如果沒有使用特殊的API,我們把此處設(shè)為3即可保證良好的兼容性。4.點擊Finish,完成設(shè)置。創(chuàng)建完成后,我們即可在方才設(shè)置的工作目錄中找到項目文件。ADT會為我們創(chuàng)建以下目錄及文件:src/該目錄下保存我們所編寫的Java代碼文件。<AndroidVersion>/該目錄下是我們所設(shè)置的目標(biāo)Android版本所對應(yīng)的android.jargen/該目錄下保存的是由ADT根據(jù)我們的界面設(shè)置、資源設(shè)置等自動生成的代碼assets/初始為空,可以用來存放assets文件res/保存程序要用到的資源,如窗口布局、字符串值等AndroidManifest.xml用于描述應(yīng)用程序的文件,Android會讀取該文件,用以確定應(yīng)用程序所需要的權(quán)限等信息。perties用于保存該項目的信息,比如各項設(shè)置,該文件也由ADT管理,不需要手動編輯。2.3.2編譯運行一個項目為了節(jié)省時間,我們大多數(shù)的測試都是在模擬器上運行,最后才在真實的硬件上運行程序。Android的SDK中提供有模擬器程序,要讓模擬器運行起來,我們則還需要創(chuàng)建稱為AVD(AndroidVitualDevice)的配置文件。SDK中的命令行工具可以用來創(chuàng)建AVD,安裝ADT之后我們也可以更直觀地用圖形界面創(chuàng)建。創(chuàng)建AVD選擇Window>AndroidSDKandAVDManager,打開AVD管理器在彈出的窗口中會列出已經(jīng)創(chuàng)建的AVD,我們點擊創(chuàng)建一個新的AVD填寫所需的選項。包括AVD名稱,是否需要SD,虛擬屏幕的分辨率等。單擊CreateAVD,創(chuàng)建完畢。運行程序運行(或調(diào)試程序)可以通過點擊主菜單上的Run>Run(或Run>Debug),ADT會為我們啟動模擬器,并在模擬器中運行或調(diào)試我們的程序。在這個過程中,實際上Eclipse為我們完成了以下工作:如果項目中的文件有改動,就重新編譯一次。如果沒有設(shè)置啟動選項,就創(chuàng)建之。如果模擬器還沒有啟動,就運行模擬器。通過Socket向模擬器發(fā)送編譯過后的程序。向模擬器發(fā)送命令安裝并啟動該應(yīng)用。如果是以調(diào)試方式運行,則應(yīng)用程序啟動后會等待調(diào)試器掛接,同時Eclipse 會切換到調(diào)試視圖。配置運行選項在編寫應(yīng)用程序的過程中,我們有時候需要調(diào)整運行設(shè)置,比如運行不同的AVD,啟動應(yīng)用程序的某個特定Activity。這時,我們可以按以下步驟設(shè)置:打開Run>OpenRunDialog,彈出設(shè)置窗口展開AndroidApplication節(jié)點,點擊項目名稱,右側(cè)即會顯示出相應(yīng)的配置選項卡。在Android,Target,Common三個選項卡中,根據(jù)需要,修改設(shè)置。點擊Run,即會根據(jù)新的設(shè)置運行。為應(yīng)用程序簽名出于安全的考慮,所有的Android應(yīng)用程序都必須有數(shù)字簽名,Android系統(tǒng)才會允許安裝該程序。在開發(fā)程序時,我們可以使用調(diào)試密鑰(debugkey),帶有這種密鑰的應(yīng)用程序可以在模擬器或是在我們開發(fā)用的設(shè)備上安裝。如果要正式發(fā)布應(yīng)用程序,則還需要取得正式的私鑰。在實例開發(fā)一節(jié)中,講詳細(xì)介紹如何為應(yīng)用程序打上數(shù)字簽名。2.4Android平臺應(yīng)用程序基礎(chǔ)2.4.1概要Android應(yīng)用程序編寫完成后,都是由aapt工具(ADT會自動調(diào)用該工具)打包成apk文件,一個apk文件就是一個完整的應(yīng)用程序,它包含了編譯好了的程序以及各種資源、描述性文件(如Manifest.xml)。在運行時,每個Android應(yīng)用程序具有如下特點:默認(rèn)情況下,每個應(yīng)用程序都運行在一個Linux進(jìn)程中。當(dāng)應(yīng)用程序中的某部分代碼需要得到執(zhí)行時,Android會為這個應(yīng)用程序啟動一個進(jìn)程,該進(jìn)程會一直存在,直到代碼中要求退出,或者系統(tǒng)資源不足時Android將其殺死。每個進(jìn)程都運行于一個相互獨立的JVM。默認(rèn)情況下,每個應(yīng)用程序都會被賦予一個唯一的LinuxuserID。結(jié)合Linux的權(quán)限設(shè)置,就可以保證只有該應(yīng)用程序可以訪問屬于它的文件。某些特殊情況下,我們可以讓兩個應(yīng)用程序共用一個LinuxuserID,這時,應(yīng)用程序的文件相互之間都是可以訪問的。為了節(jié)約系統(tǒng)資源,Android會自動把這兩個應(yīng)用程序合并到一個進(jìn)程中,共享一個JVM。2.4.2Android應(yīng)用程序組件Android應(yīng)用程序最大的一個特點就是每個應(yīng)用都由若干組件構(gòu)成。而且各個應(yīng)用程序的組件還可以相互調(diào)用(需要在代碼中設(shè)置相應(yīng)權(quán)限)。例如假設(shè)我們需要編寫一個內(nèi)嵌有網(wǎng)頁的程序,那么我們無需親自編寫瀏覽器,而是可以直接調(diào)用系統(tǒng)自帶的ChromeLite瀏覽器組件。又如假設(shè)我們編寫了兩個應(yīng)用程序,其中一個程序中有列表顯示圖片的組件,那么我們在另外一個應(yīng)用程序中就可以使用該組件,而不需要再編寫該功能。也就是說,不同于我們平常編寫的程序,Android的應(yīng)用程序不是單一入口,而是可以從代碼的不同位置啟動。這就要依靠組件來實現(xiàn)。Android應(yīng)用程序的組件有以下四種:Activities一個activity實際上表現(xiàn)出來的就是一個程序的界面。這個界面可能有許多種不同的形式,比如有列表形式,有文字形式,有圖像格子等形式。一個應(yīng)用程序也可能有不止一個activity。比如一個短消息的程序,需要有列表顯示所有消息的activity,還至少需要一個編輯短消息的activity(界面),還可能需要設(shè)置、菜單等界面。每個activity都有一個默認(rèn)的窗口用于繪制界面,一般情況下,它是充滿全屏的,但是我們可以通過程序控制它,使其小于屏幕大小,也可以控制其浮動于其它窗口之上(如Android中的Toast信息),Activity中顯示出來的內(nèi)容其實是由view堆疊形成的,view是由View基類派生出來的各種形式的界面元素,如ListView,GridView等等,通過組合這些view,就形成了一個可見的activity。我們可以用Activity.setContentView()方法來設(shè)置一個activity中所要顯示的view。Servicesservice是一種沒有界面的組件,同我們平常在Windows或Linux系統(tǒng)中所理解的“服務(wù)”一樣,Android上的service也是運行在后臺的,運行時間可以從系統(tǒng)啟動到系統(tǒng)關(guān)閉為止。對于許多應(yīng)用程序來說,service組件是至關(guān)重要的。以下載管理器為例,用戶肯定希望能夠在切換到其它程序時仍然在后臺進(jìn)行下載,這就需要用到service完成下載工作。而顯示下載進(jìn)度、已下載文件等信息則由activity完成,同時我們還希望能控制下載過程,如停止、繼續(xù)等,這就需要activity與service之間進(jìn)行通信。Android允許activity連接到或者綁定到service上,這樣就可以讓用戶在界面上控制后臺service的行為。BroadcastreceiversBroadcast意為廣播消息,Android系統(tǒng)自身會發(fā)出許多廣播消息,如電量不足,用戶修改了全局設(shè)置等,各個應(yīng)用程序也以向整個系統(tǒng)廣播消息,如文件下載完畢等。Broadcastreceiver則是程序中專門用來接收廣播消息的組件,它沒有界面顯示,只負(fù)責(zé)監(jiān)聽、接收廣播消息,然后根據(jù)程序邏輯,啟動其它組件去處理廣播消息。它可以啟動一個activity來同用戶交互,也可以使用NotificationManager向用戶發(fā)出通知。NitificationManager的通知形式有許多種,比如說振動、響鈴、閃LED燈,還可以在Android界面的消息欄處顯示信息。Contentproviderscontentprovider是一種為其它應(yīng)用程序提供數(shù)據(jù)的組件。這些數(shù)據(jù)可以保存在文件中,也可以保存在SQLite數(shù)據(jù)庫中,還可以以其它任何有效的方式保存。ContentProvider類為我們提供了一系列保存數(shù)據(jù)的方法供我們調(diào)用,可以很方便地存儲數(shù)據(jù)。其它應(yīng)用程序在需要使用這些數(shù)據(jù)時,可以用ContentResolver對象,使用其中的方法。ContentResolver可以與任何contentprovider交互,獲取其中的數(shù)據(jù)。只要需要某個組件,Android就會盡力保證它的可用:如果該組件還沒啟動,就啟動它,如果該組件所屬的應(yīng)用程序還沒擁有一個進(jìn)程,則為它啟動一個進(jìn)程,如果系統(tǒng)資源不足以容納一個新的進(jìn)程,則將后臺的某個進(jìn)程殺死為新進(jìn)程騰出資源。2.4.3AndroidManifest.xml文件在Android啟動某個程序之前,它得事先知道程序中有哪些組件。因此,apk文件中需要有一些描述信息,告知Android系統(tǒng),這個任務(wù)就由AndroidManifest.xml文件完成。AndroidManifest.xml文件是一個結(jié)構(gòu)化的XML文件,它除了包含有各個組件的信息,還包括許多其它的信息,如聲明該程序所需要用到的庫、聲明所需要的權(quán)限等。它的基本樣式如下所示:<?xmlversion="1.0"encoding="utf-8"?><manifest...><application...><activityandroid:name="ject.FreneticActivity"android:icon="@drawable/small_pic.png"android:label="@string/freneticLabel"...></activity>...</application></manifest>不難看出,name,icon,lable這些屬性就分別指activity的名稱、圖標(biāo)、標(biāo)識。我們通過manifest描述程序的信息,Android系統(tǒng)就能讀取出來并產(chǎn)生相應(yīng)的行為。3.音樂播放器實例為了更好地體會Android應(yīng)用程序的開發(fā),我們將編寫一個簡易的音樂播放器為例,逐步分析如何編寫一個Android程序。下圖就是播放器在模擬器中運行的截圖。它具有基本的播放功能,能自動掃描SD卡中的Music目錄,并列出該目錄下的所有mp3文件。點擊列表中的歌曲名稱即可播放,通過上方的按鈕可以控制暫停、繼續(xù)、上一曲、下一曲。3.1創(chuàng)建項目點擊File->New->Project,選擇AndroidProject,再點擊Next,即彈出項目屬性窗口。填寫項目名稱。在Contents選項中,我們按如圖所示選擇。保存的位置可以根據(jù)需要選擇"Usedefaultlocation"或是另外選擇。在BuildTarget選項中,我們從已經(jīng)安裝的平臺中選擇一個,我們選擇1.5版。在Properties選項中,我們按如下所示填寫:填寫完畢后,點擊"Finish",項目即創(chuàng)建好了。在Eclipse的左側(cè)欄中,我們可以看到項目的結(jié)構(gòu):顧名思義,src目錄就是我們將要編寫的java代碼文件。另外需要我們注意的就是res這個目錄。它下面的drawable目錄保存的是我們要用到的圖片。layout目錄保存的是描述窗口布局的XML文件。values文件則保存的是包含有字符串值信息的XML文件。3.2設(shè)計界面該播放器程序的主界面并不復(fù)雜,它由兩部分組成,上半部分是一排按鈕,下半部分是一個列表。下面我們逐步分析如何繪制界面。3.2.1準(zhǔn)備圖片該程序共用需要以下7個圖標(biāo),全部為png格式。把這些圖標(biāo)放在項目的res/drawable目錄下。3.2.2準(zhǔn)備字符串資源除了圖片資源,在程序中,我們還需要用到一些字符串資源。之所以不將字符串直接寫入java代碼中,是因為那樣在項目規(guī)模大了以后不便于管理,也不便于實現(xiàn)多語言等功能。利用ADT,我們可以很方便地添加字符串資源。步驟如下:展開左側(cè)欄中的res/values目錄,雙擊打開values目錄下的strings.xml文件。在編輯窗口中,我們可以看到ADT已經(jīng)為我們自動添加了名為hello和app_name的兩個String類型的資源。下面我們將添加另外一個字符串,當(dāng)歌曲列表中沒有曲目時,就將顯示該字符串。首先,點擊Add...,在彈出的窗口中,選擇String,然后點擊OK。然后在Name和Value處填入字符串的名稱和字符串的內(nèi)容。保存之后,就可以在其它地方引用該資源。3.2.3設(shè)計程序的窗口布局窗口布局文件位于res/layout目錄下,我們將在layout目錄下創(chuàng)建我們的布局文件。在左側(cè)欄中的layout文件夾上右鍵,選擇New->File,在彈出的窗口中的Filename處填入songlist.xml。單擊Finish,即創(chuàng)建了一個空的布局文件。如果對Android布局XML文件的語法非常熟悉,那么可以直接編輯該文件,但是一般情況下,我們還是用ADT工具進(jìn)行所見即所得的編輯。Android的窗口是由Layout和View組成的,Layout中可以包含View和Layout。我們這個應(yīng)用的界面排列較簡單,因此,最外層的Layout可以采用LinerLayout這種比較簡單的格式。要添加它,先點擊右側(cè)邊欄中Outline選項卡下的綠色“+”按鈕,在彈出的窗口中選擇LinerLayout,就添加成功了,在Outline窗口中就可以看到剛剛添加的這一項,同時中間的主窗口中也會顯示一個空的黑色窗體。另外,我們還可以修改某個Layout或View的屬性,方法是在右側(cè)的Outline窗口中選中要修改的窗口元素,在下側(cè)邊欄中,切換到Properties選項卡,就可以看到所有的項目屬性。大多數(shù)的選項都不需要我們手動設(shè)置。下面我們繼續(xù)添加其它的窗口元素。Layout下可以嵌套其它的Layout和View,界面的上部分就是在最外層的LinerLayout下再放置了一個LinerLayout,然后在里層的LinerLayout里放置一排ImageButton。界面的下半部分是一個ListView(或者TextView)。當(dāng)要在某個Layout里添加元素時,只需要先點擊選中該Layout然后再點擊"+"圖標(biāo),就可以添加子元素到其中。最后布局層次如圖所示:這時我們還需要對各個元素的屬性作一些修改。例如對于5個ImageButton,我們需要設(shè)置其Src屬性。這個屬性表示的是圖片的來源。例如back按鈕上要顯示是的一個指向左邊的箭頭,這個箭頭圖標(biāo)名為back.png,在前述步驟中已經(jīng)被放在了res/drawable目錄中了。我們要把這個圖標(biāo)設(shè)為back按鈕的圖片來源,就需要在Src屬性處填入"@drawable/back"。"@drawable/back"就是引用這個箭頭圖標(biāo)資源的ID。如左圖所示,在第一個LinerLayout下面,我們還添加了一個View。這個View中沒有顯示元素,而只是起一個分隔線的作用,讓界面更美觀一些。我們把這個View的Layoutheight屬性設(shè)為5dip,在顯示時,上方的按鈕就不會和下方的歌曲列表擠在一起了。在空白View的下方,可以看到,我們分別添加了一個ListView和一個TextView。值得注意的是,這兩個元素其實并不會同時顯示。這是因為它們的Id分別為"@android:id/list"和"@android:id/empty",這種Id屬于Android系統(tǒng)的特殊Id,分別表示列表時要顯示的和列表中無條目時要顯示的元素。這樣的話就不需要我們再編寫代碼來根據(jù)列表是否為空來顯示相應(yīng)元素了。最后,我們還可以根據(jù)需要,把元素的Id改成便于記憶的名稱這樣在使用時就更容易記憶。完成所有這些工作后,在Eclipse的主窗口中,就可以看到程序界面的預(yù)覽效果。3.3編寫Java代碼設(shè)計好了界面之后,下一步就是編寫程序的Java代碼了。由于該程序較為簡單,只有MusicPlayer.java一個代碼文件。其中的MusicPlayer類完成了絕大部分的操作。MusicPlayer的成員變量。其中:MEDIA_PATH是掃描音樂文件的起始目錄;songs是用于保存歌曲路徑的數(shù)組;mp是一個MediaPlayer的對象,我們通過這個對象控制音樂的播放、暫停等操作;currentPosition是當(dāng)前播放的歌曲在列表中的序號,列表中的每一項都依次有一個序號,我們根據(jù)這個序號來判斷上一曲和下一曲;status是指當(dāng)前播放的狀態(tài),值為0表示停止播放,為1表示正在播放,為2表示被暫停播放。除此之后,4個Imageutton對象和1個ListView對象也分別有相應(yīng)的成員變量。編寫onCreate()函數(shù)onCreeate函數(shù)是會在MusicPlayer程序啟動時得到調(diào)用的一個函數(shù)。因此需要在這里完成各種初始化的工作。首先要做的是調(diào)用全局的onCreate函數(shù),這樣才能確保一些更基本的初始化工作在我們的初始化工作之前完成。然后就是使用setContentView函數(shù)設(shè)置界面布局,可以看到,我們傳遞給該函數(shù)的參數(shù)是R.layout.songlist,這就是在代碼中引用布局文件的方式,其中R是一個全局的對象,包含了所有的資源(如圖片、布局等)。繪完窗口之后,我們調(diào)用一個成員方法updateSongList來更新歌曲列表。另外我們要在初始時做的就是設(shè)置事件監(jiān)聽函數(shù)。我們要監(jiān)聽對控制按鈕的點擊,還有對歌曲列表中各項的點擊。給這些元素綁定事件監(jiān)聽函數(shù)就在這里完成。以Play按鈕為例:playButton變量是一個ImageButton對象,setOnClickListener方法用于為這個對象添加一個監(jiān)聽函數(shù)。它的參數(shù)是一個onClickListener(),作用是監(jiān)聽單擊事件。在OnClickListerner中我們編寫了onClick函數(shù),根據(jù)當(dāng)前的狀態(tài),判斷點擊Play按鈕之后應(yīng)該進(jìn)行什么操作。除了Play按鈕之外,還有stop按鈕,以及上一曲、下一曲按鈕。為它們添加事件監(jiān)聽函數(shù)的方式大同小異。稍有不同的是about按鈕,點擊它之后并不會影響播放,而是在程序窗口的上層浮動顯示出提示信息。如代碼中所示,顯示這種浮動信息所用的是Toast類,Toast.makeText方法可以構(gòu)造一條這樣的提示信息。setGravity方法是用于設(shè)置浮動信息在界面中的顯示位置,最后調(diào)用show方法就可以把信息顯示出來。編寫播放控制函數(shù)播放控制函數(shù)一共有playSong,stopSong,preSong,nextSong,pauseSong,continueSong這6個,我們以playSong為例:首先,我們要把當(dāng)前狀態(tài)設(shè)為1(即播放狀態(tài)),然后,要用setImageResource函數(shù)把按鈕的圖標(biāo)換成暫停圖標(biāo),setBackgroundColor把將要播放的歌曲所在條目的背景換成灰色,這樣就能知道當(dāng)前正處于播放狀態(tài),以及播放的是哪個曲目了。隨后要做的就是MediaPlayer對象的初始化。由于初始化可能由于種種原因不能成功(如文件無法讀取等),需要把它放在try塊里,并記錄可能出現(xiàn)的異常。MediaPlayer對象在使用前要注意reset,因為它會保存上次的播放狀態(tài)。reset之后,就可以用setDaataSource來設(shè)置多媒體文件的路徑了。這個路徑既可以是本地的,也可以是遠(yuǎn)程的。比如我們把一個http協(xié)議下的音樂鏈接傳遞給MediaPlayer對象,它能自動下載、緩沖、播放遠(yuǎn)程的文件,在本例中,我們只需要用到播放本地文件的功能。Prepare方法則是用于異步地準(zhǔn)備播放的數(shù)據(jù)。比如在播放遠(yuǎn)程文件時,使用該方法就會從遠(yuǎn)程獲取數(shù)據(jù)而不阻塞其它動作。作好這些準(zhǔn)備后,就可以調(diào)用start方法,如果之前的狀態(tài)是暫停播放,start方法就會繼續(xù)播放(除非調(diào)用了reset方法),否則,它就會從頭開始播放音頻文件。為了解決自動連續(xù)播放的問題,我們還要監(jiān)聽播放完畢這個事件,就是通過setOnCompletionListener方法設(shè)置一個監(jiān)聽器,監(jiān)聽到播放完成后就切換到下一曲繼續(xù)播放。另外幾個控制播放的方法也基本上都是對MediaPlayer對象的控制。在此不在贅述,詳細(xì)代碼請參見附錄。生成文件列表在onCreate方法中,我們調(diào)用了updateSongList方法,它的代碼如下:在這個函數(shù)中,先是遍歷MEDIA_PATH下的所有MP3文件(通過Mp3Filter過濾器實現(xiàn),Mp3Filter類的代碼參見附錄),把所有文件的路徑保存到songs數(shù)組中。然后就是設(shè)置一個Adapter,設(shè)置列表為空時就顯示song_item這個布局文件,而不是正常情況下的曲目列表。3.4運行、調(diào)試程序要運行或調(diào)試項目,可以使用快捷鍵Ctrl+F11(運行)或F11(調(diào)試)。如果沒有事先啟動模擬器,則會在這時候啟動模擬器,模擬器啟動之后,Eclipse會把編譯好的apk文件上傳并安裝到模擬器中,同時發(fā)送信號啟動該程序。在Eclipse的Console窗口中,我們可以看到以下信息:這些信息清楚地顯示了每一步的操作。另外,如果是要調(diào)試程序的話,程序啟動之后還會等待連接Eclipse上的調(diào)試器,同時Eclipse會切換到調(diào)試視圖。在該視圖中我們可以使用單步跟蹤等各種調(diào)試功能。 3.5打包發(fā)布程序使用ADT工具,我們可以很方便地程序進(jìn)行打包操作,并打上自己的簽名。點擊File->Export。在彈出的窗口中選擇"ExportAndroidApplication",點擊"Next"。接著會彈出窗口要求選擇一個項目,我們選擇MusicPlayer這個項目,然后再點擊"Next"。第一次進(jìn)行此操作時,會要求創(chuàng)建keystore,因此,要在此處輸入想要設(shè)置的密碼,并重新輸入一次核對(如果不是第一次,則在此處輸入設(shè)置的密碼)。另外還可以選擇keystore的位置,一般保持默認(rèn)即可。完成后點擊"Next"。如果是第一次來到這步操作,則會要求填寫信息創(chuàng)建密鑰。按要求填寫完各項即可。若不是第一次來到此步,則只需要選用一個已經(jīng)存在的keystore并輸入這個keystore的密碼。然后再點擊"Next"。如果密碼正確,則會要求選擇所生成的APK文件的位置。選擇完畢后點擊"Finish",我們即可在剛才選擇的位置處找到APK文件,把它傳至Android終端里,即可安裝運行。在我的Android手機(jī)上,MusicPlayer的運行效果如圖所示。至此,我們的項目實例就完成了,如果覺得所開發(fā)的應(yīng)用有實用價值,我們還可以申請一個AndroidAppMarket的帳戶,把自己的應(yīng)用程序上傳到AppMarket中,這樣就可以與全球的Android用戶分享自己的作品了。4.參考資料[1] Android開發(fā)者網(wǎng)站:[2] Android中文網(wǎng): [3] CSDN: 5.附錄5.1song_item.xml的代碼<?xmlversion="1.0"encoding="utf-8"?><TextViewandroid:id="@+id/text1" xmlns:android="/apk/res/android" android:layout_width="wrap_content"android:layout_height="wrap_content" android:paddingLeft="10dip"/>、5.2songlist.xml的代碼<?xmlversion="1.0"encoding="UTF-8"?><LinearLayoutxmlns:android="/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayoutandroid:id="@+id/LinearLayout01" android:layout_width="wrap_content"android:layout_height="wrap_content"> <ImageButtonandroid:layout_width="wrap_content" android:layout_height="wrap_content"android:id="@+id/back" android:src="@drawable/back"></ImageButton> <ImageButtonandroid:layout_width="wrap_content" android:layout_height="wrap_content"android:id="@+id/stop" android:src="@drawable/stop"></ImageButton> <ImageButtonandroid:id="@+id/play"android:layout_width="wrap_content" android:layout_height="wrap_content"android:src="@drawable/play"></ImageButton> <ImageButtonandroid:layout_width="wrap_content" android:layout_height="wrap_content"android:id="@+id/forward" android:src="@drawable/forward"></ImageButton> <ImageButtonandroid:layout_width="wrap_content" android:layout_height="wrap_content"android:id="@+id/about" android:background="@drawable/about"android:layout_gravity="bottom"></ImageButton> </LinearLayout> <Viewandroid:id="@+id/View01"android:layout_width="wrap_content" android:layout_height="5dip"></View> <ListViewandroid:id="@android:id/list"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_weight="1" android:drawSelectorOnTop="false" android:scrollbarAlwaysDrawVerticalTrack="true"></ListView> <TextViewandroid:id="@android:id/empty"android:layout_width="fill_parent" android:layout_height="fill_parent"android:text="@string/no_song"/></LinearLayout>5.3strings.xml文件代碼<?xmlversion="1.0"encoding="utf-8"?><resources><stringname="hello">HelloWorld,MusicPlayer!</string><stringname="no_song">尚未選擇曲目</string></resources>5.4AndroidManifest.xml文件代碼<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"package="com.xubin.android"android:versionCode="1"android:versionName="1.0"><applicationandroid:icon="@drawable/icon"android:label="@string/app_name"><activityandroid:name=".MusicPlayer"android:label="@string/app_name"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity></application><uses-sdkandroid:minSdkVersion="3"/></manifest>5.5MusicPlayer.java的代碼packagecom.xubin.android;importjava.io.File;importjava.io.FilenameFilter;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importandroid.app.ListActivity;importandroid.content.Context;importandroid.graphics.Color;importandroid.media.MediaPlayer;importandroid.media.MediaPlayer.OnCompletionListener;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Gravity;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.ArrayAdapter;importandroid.widget.ImageButton;importandroid.widget.ListView;importandroid.widget.Toast;classMp3FilterimplementsFilenameFilter{ publicbooleanaccept(Filedir,Stringname){ return(name.endsWith(".mp3")); }}publicclassMusicPlayerextendsListActivity{ privatestaticfinalStringMEDIA_PATH=newString("/sdcard/Music"); privateList<String>songs=newArrayList<String>(); privateMediaPlayermp=newMediaPlayer(); privateintcurrentPosition=0; // 當(dāng)前播放的歌曲序號 privateintstatus=0; // 播放狀態(tài) privateImageButtonstopButton; privateImageButtonplayButton; privateImageButtonbackwardButton; privateImageButtonforwardButton; privateImageButtonaboutButton; privateListViewlv; @Override publicvoidonCreate(Bundleicicle){ super.onCreate(icicle); setContentView(R.layout.songlist); updateSongList(); lv=this.getListView(); stopButton=(ImageButton)findViewById(R.id.stop); playButton=(ImageButton)findViewById(R.id.play); backwardButton=(ImageButton)findViewById(R.id.back); forwardButton=(ImageButton)findViewById(R.id.forward); aboutButton=(ImageButton)findViewById(R.id.about); stopButton.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ stopSong(); } }); playButton.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ switch(status){ case0: playSong(MEDIA_PATH+"/"+songs.get(currentPosition)); break; case1: pauseSong(); break; case2: continueSong(); break; } } }); backwardButton.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ preSong(); } }); forwardButton.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ nextSong(); } }); aboutButton.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ Contextcontext=getApplicationContext(); CharSequencetext="Android下的音樂播放器\n我的課程設(shè)計\n2010-2-7"; intduration=Toast.LEN

溫馨提示

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

評論

0/150

提交評論