




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、安卓應(yīng)用開(kāi)發(fā)基礎(chǔ)作者:安卓開(kāi)發(fā)員Android應(yīng)用程序是用Java編程語(yǔ)言編寫(xiě)的。Android SDK工具可以編譯任何數(shù)據(jù)和資源文件的代碼成一個(gè)文件后綴為.apk的安卓程序包。所有的在一個(gè)單一的代碼.apk文件被認(rèn)為是一個(gè)應(yīng)用程序,是Android的文件,供電設(shè)備來(lái)安裝應(yīng)用程序。 一旦安裝在設(shè)備上,每個(gè)Android應(yīng)用程序的生命在它自己的安全沙箱上:Android操作系統(tǒng)是一個(gè)多用戶Linux系統(tǒng),每個(gè)應(yīng)用程序都是一個(gè)不同的用戶。默認(rèn)情況下,每個(gè)應(yīng)用程序的系統(tǒng)分配一個(gè)唯一的Linux用戶ID(該ID僅用于由系統(tǒng)是未知的應(yīng)用程序),系統(tǒng)設(shè)置所有的應(yīng)用程序中的文件權(quán)限,以便只有用戶ID分配給該
2、應(yīng)用程序可以訪問(wèn)它們。每個(gè)進(jìn)程都有它自己的虛擬機(jī)(VM),因此應(yīng)用程序的代碼與其他應(yīng)用程序隔離運(yùn)行。默認(rèn)情況下,每個(gè)應(yīng)用程序運(yùn)行在它自己的Linux進(jìn)程。在Android啟動(dòng)過(guò)程時(shí),應(yīng)用程序的任何組件需要被執(zhí)行,在關(guān)閉該進(jìn)程時(shí),它不再需要或恢復(fù)時(shí),系統(tǒng)必須為其他應(yīng)用程序提供內(nèi)存。 這樣一來(lái),Android系統(tǒng)實(shí)現(xiàn)了最小特權(quán)原則,也就是說(shuō),每個(gè)應(yīng)用程序,默認(rèn)情況下,只需要訪問(wèn)的組件,它需要再做更多的工作。這將創(chuàng)建一個(gè)非常安全的環(huán)境,使應(yīng)用程序無(wú)法訪問(wèn)的,這就是它沒(méi)有給予許可制度的部分。 但是,有一個(gè)應(yīng)用程序的方法與其他應(yīng)用程序和應(yīng)用程序訪問(wèn)系統(tǒng)服務(wù)的數(shù)據(jù):這有可能為兩個(gè)應(yīng)用程序安排共享相同的Li
3、nux用戶ID,在這種情況下,它們能夠相互訪問(wèn)的文件。為了節(jié)約使用相同的用戶ID系統(tǒng)資源,應(yīng)用程序還可以安排運(yùn)行在相同的Linux進(jìn)程和共享同一個(gè)VM(應(yīng)用也必須使用相同的證書(shū)簽名)。應(yīng)用程序可以請(qǐng)求訪問(wèn)權(quán)限,如用戶的聯(lián)系人,短信,可安裝存儲(chǔ)(SD卡),攝像頭,藍(lán)牙等設(shè)備的數(shù)據(jù),所有應(yīng)用程序的權(quán)限必須由用戶在安裝時(shí)授予。 覆蓋的基礎(chǔ)是如何讓?xiě)?yīng)用程序在安卓中存在,本文向您介紹:1、框架的核心組件定義應(yīng)用程序。2、清單文件中聲明組件和應(yīng)用程序所需的設(shè)備功能。3、資源是從應(yīng)用程序代碼分開(kāi),并允許您的應(yīng)用程序正常優(yōu)化的設(shè)備配置各種其行為。應(yīng)用程序組件(Application Components) A
4、ndroid的核心功能之一就是一個(gè)應(yīng)用程序可以使用其它應(yīng)用程序的元素(如果那個(gè)應(yīng)用程序允許的話)。比如說(shuō),如果你的應(yīng)用程序需要一個(gè)圖片卷動(dòng)列表,而另一個(gè)應(yīng)用程序已經(jīng)開(kāi)發(fā)了一個(gè)合用的而又允許別人使用的話,你可以直接調(diào)用那個(gè)卷動(dòng)列表來(lái)完成工作,而不用自己再開(kāi)發(fā)一個(gè)。你的應(yīng)用程序并沒(méi)有吸納或鏈接其它應(yīng)用程序的代碼,它只是在有需求的時(shí)候啟動(dòng)了其它應(yīng)用程序的那個(gè)功能部分。 為達(dá)到這個(gè)目的,系統(tǒng)必須在一個(gè)應(yīng)用程序的一部分被需要時(shí)啟動(dòng)這個(gè)應(yīng)用程序,并將那個(gè)部分的Java對(duì)象實(shí)例化。與在其它系統(tǒng)上的應(yīng)用程序不同,Android應(yīng)用程序沒(méi)有為應(yīng)用準(zhǔn)備一個(gè)單獨(dú)的程序入口(比如說(shuō),沒(méi)有main()方法), 而是為系
5、統(tǒng)依照需求實(shí)例化提供了基本的組件。共有四種組件類型:活動(dòng)(Activities)一個(gè)activity代表用戶界面的一個(gè)獨(dú)立屏幕。例如,一個(gè)郵件應(yīng)用程序應(yīng)該有一個(gè)activity用于顯示新郵件列表,另一個(gè) activity用于撰寫(xiě)一封郵件,還有一個(gè)activity用于讀取郵件。盡管所有activitie協(xié)同工作以構(gòu)成郵件應(yīng)用程序的用戶體驗(yàn),但彼此之間相對(duì)獨(dú)立。應(yīng)次,不同的應(yīng)用程序能夠從任何一個(gè) activity啟動(dòng)(只要郵件應(yīng)用程序允許)。例如,用戶需要分享一張照片,一個(gè)拍照應(yīng)用程序能夠啟動(dòng)郵件應(yīng)用程序的 activity 。activity是一個(gè)實(shí)現(xiàn)Activity的子類,你可以在Activi
6、ties開(kāi)發(fā)者指導(dǎo)部分了解更多。服務(wù)(Services)service是在后臺(tái)運(yùn)行,執(zhí)行長(zhǎng)時(shí)間操作或者執(zhí)行遠(yuǎn)程操作。 service不提供用戶界面。例如,當(dāng)用戶在另一個(gè)應(yīng)用程序時(shí),一個(gè) service 可在后臺(tái)播放音樂(lè),或者是從網(wǎng)絡(luò)上獲取數(shù)據(jù),而不阻斷用戶與當(dāng)前activity的交互。其他組件,比如一個(gè)activity ,為了與該service互動(dòng),可以啟動(dòng)或者 綁定它。service是一個(gè)實(shí)現(xiàn)了Service的子類,你可以在Services開(kāi)發(fā)者指導(dǎo)部分了解更多。廣播接收器(Broadcast receivers)廣播接收器是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件。很多廣播是源自于
7、系統(tǒng)代碼的比如,通知時(shí)區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語(yǔ)言選項(xiàng)。應(yīng)用程序也可以進(jìn)行廣播比如說(shuō),通知其它應(yīng)用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。內(nèi)容提供者(Content providers)內(nèi)容提供者將一些特定的應(yīng)用程序數(shù)據(jù)供給其它應(yīng)用程序使用。數(shù)據(jù)可以存儲(chǔ)于文件系統(tǒng)、SQLite數(shù)據(jù)庫(kù)或其它方式。內(nèi)容提供者繼承于ContentProvider基類,為其它應(yīng)用程序取用和存儲(chǔ)它管理的數(shù)據(jù)實(shí)現(xiàn)了一套標(biāo)準(zhǔn)方法。然而,應(yīng)用程序并不直接調(diào)用這些方法,而是使用一個(gè)ContentResolver對(duì)象,調(diào)用它的方法作為替代。ContentResolver可以與任意內(nèi)容提供者進(jìn)行會(huì)話,與其合作來(lái)
8、對(duì)所有相關(guān)交互通訊進(jìn)行管理。 Android系統(tǒng)設(shè)計(jì)的一個(gè)獨(dú)特方面是任何的一個(gè)程序都可以啟動(dòng)另一程序的組件。比如,你想讓你的程序可以使用照相機(jī)拍照,如果已經(jīng)有了實(shí)現(xiàn)這種功能的程序并且你你的程序能使用它(有權(quán)限),那么你就沒(méi)有再要再寫(xiě)一個(gè)新的Activity來(lái)實(shí)現(xiàn)這個(gè)功能。你的程序不需要包含或者鏈接這個(gè)拍照程序。相反,你只需要在你的程序中打開(kāi)這個(gè)拍照程序中的實(shí)現(xiàn)拍照功能的Activity。當(dāng)拍完之后,拍好的照片甚至?xí)詣?dòng)返回給你的程序。者對(duì)于用戶來(lái)說(shuō),就好像是想拍照功能的程序就是你的這個(gè)程序的一部分一樣。 當(dāng)系統(tǒng)啟動(dòng)一個(gè)組件之后,如果這個(gè)組件所在的程序之前沒(méi)有運(yùn)行的話,系統(tǒng)會(huì)自動(dòng)開(kāi)始這個(gè)程序的進(jìn)
9、程,并初始化這個(gè)組件所需要的相關(guān)類。比如,你的程序開(kāi)啟了一個(gè)拍照功能程序的Activity,這時(shí)系統(tǒng)會(huì)啟動(dòng)這個(gè)Activity所在的程序,所以這個(gè)Activity運(yùn)行在拍照功能的程序當(dāng)中,而不是在你的程序中。所以,不像其他操作系統(tǒng)的中的程序一樣,Android程序沒(méi)有一個(gè)單獨(dú)的入口點(diǎn)(比如沒(méi)有我們常見(jiàn)的main()函數(shù))。 因?yàn)橄到y(tǒng)中的程序運(yùn)行在自己的獨(dú)立進(jìn)程中,并且程序中的文件都有自己的限制其他程序訪問(wèn)的權(quán)限,所以,你的程序不能直接激活其他程序中的組件。但是Android系統(tǒng)就可以。具體是這樣的實(shí)現(xiàn)的,為了激活(activate)其他程序中的組件,你必須向系統(tǒng)發(fā)送一個(gè)消息來(lái)詳細(xì)說(shuō)明你要啟動(dòng)其
10、他組件的意圖,這樣系統(tǒng)才會(huì)為你激活這個(gè)組件。 激活組件(Activating Components) 四大組件中的三個(gè)組件activities、services和broadcast receiver是由一種叫intent的異步消息來(lái)激活的。這些intents在運(yùn)行時(shí)(runtime)將這些屬于你的程序或不同程序的單獨(dú)的組件綁定在一起(bind),你可以把這些intents看作是需要其他組件的action的messengers。 一個(gè)intent就是一個(gè)Intent對(duì)象,這個(gè)intent定義了一種可以激活(activate)某個(gè)特定組件或者某種特定類型的組件,這兩種情況分別對(duì)應(yīng)兩種intent的
11、定義方式或者顯示的或者隱式的。 對(duì)于activities和services,一個(gè)intent定義了要執(zhí)行的操作(action)(比如,要“view”或者“send”什么)和要操作的數(shù)據(jù)的URI。比如,一個(gè)intent可能會(huì)為一個(gè)activity傳遞一個(gè)請(qǐng)求來(lái)展示一張圖片或者打開(kāi)一個(gè)網(wǎng)頁(yè)。有時(shí),你可以啟動(dòng)一個(gè)activity來(lái)得到返回的結(jié)果,在這個(gè)例子中這個(gè)activity的返回的結(jié)果也是一個(gè)Intent(比如,你可以發(fā)送一個(gè)intent讓用戶選擇一個(gè)personal contact并返回給你這個(gè)返回的intent就包含了一個(gè)指向用戶選擇的聯(lián)系人的URI)。(關(guān)于activity和service
12、的啟動(dòng)方式,下面將介紹。) 對(duì)于廣播接收者來(lái)說(shuō),intent只是簡(jiǎn)單的定義了要廣播的內(nèi)容(比如,一個(gè)用以表明電池電量很低的廣播僅包含了一個(gè)表明電池電量很低的字符串)。 最后一種組件類型content provider并不是由intent來(lái)激活的(activate)。而是由接收到ContentResolver的請(qǐng)求時(shí)激活的。 它們都各自有自己的方法來(lái)激活相應(yīng)的組件:你可以通過(guò)傳遞一個(gè)Intent給startActivity()或startActivityForResult()啟動(dòng)一個(gè)activity(或者給他一些新的要做的內(nèi)容)。使用startActivityForResult()你將得到一個(gè)返
13、回結(jié)果。你可以通過(guò)傳遞一個(gè)Intent給startService()來(lái)start一個(gè)service(或者給一個(gè)正在運(yùn)行的service一些新的指令(instructions))。或者你可以通過(guò)把一個(gè)Intent傳遞給bindService()來(lái)綁定一個(gè)service。你可以通過(guò)傳遞一個(gè)Intent給諸如sendBroadcast()、sendOrderedBroadcast()或者sendStickyBroadcast()等方法來(lái)初始化一個(gè)廣播。你可以通過(guò)調(diào)用ContentResolver的query()方法來(lái)執(zhí)行一次content provider的查詢操作。更多的關(guān)于intent的內(nèi)容,可
14、以參看文檔中的Intents and Intent Filters。更多的關(guān)于激活特定組件的內(nèi)容可以參看文檔中的:Activities、Services、BroadcastReceiver、Content Providers。組件聲明 Manifest文件的首要任務(wù)就是通知系統(tǒng)關(guān)于程序中要使用的組件。比如,一個(gè)manifest文件可以用如下的方式來(lái)聲明一個(gè)activity:java view plaincopy1.<?xml version="1.0" encoding="utf-8"?> 2.<manifest . > 3.&l
15、t;application android:icon="drawable/app_icon.png" . > 4.<activity android:name="ject.ExampleActivity" 5. android:label="string/example_label" . > 6.</activity> 7. . 8.</application> 9.</manifest> 在<application>元素中,android
16、:icon屬性用于指定一個(gè)用于標(biāo)示該程序的icon。 在<activity>元素中,android:name屬性用于確定這個(gè)擴(kuò)展自Activity的子類的全路徑名,android:label屬性用于標(biāo)示這個(gè)activity的對(duì)于用戶可見(jiàn)的label。 你必須要用以下方式來(lái)聲明你的程序組件:1、activities:<activity>標(biāo)簽2、services:<service>標(biāo)簽3、broadcast receiver:<receiver>標(biāo)簽4、content providers:<provider>標(biāo)簽 如果程序中用到activ
17、ities、services和content providers,你沒(méi)有在manifest文件中聲明,那么這些組件將不會(huì)被系統(tǒng)知道,結(jié)果就是你的程序不能運(yùn)行。然而,broadcast receiver既可以在manifest文件中聲明也可以在代碼中動(dòng)態(tài)創(chuàng)建(BroadcastReceiver),并通過(guò)調(diào)用registerReceiver()在系統(tǒng)中注冊(cè)。 更多關(guān)于怎樣為你的程序構(gòu)建manifest文件,請(qǐng)參看文檔The AndroidManifes.xml文件。聲明組件的能力 正如在上面Activating Components中討論的那樣,你可以使用一個(gè)Intent來(lái)啟動(dòng)activities
18、、services和broadcast receiver。你可以通過(guò)在intent中注明目標(biāo)組件的名字(使用的是組件的類名)來(lái)顯示的啟動(dòng)組件。然而,intents真正強(qiáng)大的地方在與關(guān)于intent的actions的概念。通過(guò)intent的actions,你可以簡(jiǎn)單的描述你要執(zhí)行的操作的類型(并且可以有選擇的描述你要處理的數(shù)據(jù)),可以允許系統(tǒng)在device中找到這個(gè)組件并啟動(dòng)它。如果有多個(gè)組件可以執(zhí)行intent中描述的action,這時(shí)用戶就可以選擇一個(gè)來(lái)執(zhí)行。 系統(tǒng)可以識(shí)別能對(duì)某intent做出反應(yīng)的方式是通過(guò)將接收到的intent和設(shè)備中其他程序的manifest文件的intent fil
19、ters進(jìn)行比較實(shí)現(xiàn)的。 當(dāng)你在程序的manifest文件中聲明一個(gè)組件之后,你可以有選擇包含intent filters,這些intent filters表明了組件對(duì)接收自其他程序的intent做出反應(yīng)的能力(capabilities)。你可以通過(guò)添加一個(gè)<intent-filter>元素作為元素的子組件的聲明來(lái)為你的程序聲明一個(gè)intent filter。 比如,在一個(gè)郵件程序中的一個(gè)activity可以編寫(xiě)新的郵件,這樣的話你就需要在manifest文件中來(lái)聲明一個(gè)intent filter來(lái)對(duì)“發(fā)送”intent響應(yīng)(為了發(fā)送郵件)。這樣,在你的程序中,一個(gè)activity
20、就可以創(chuàng)建一個(gè)發(fā)送intent(ACTION_SEND),這樣當(dāng)你調(diào)用startaActivity()時(shí),系統(tǒng)就會(huì)匹配郵件程序中的發(fā)送activity并啟動(dòng)它。 更多關(guān)于創(chuàng)建intent filters的內(nèi)容,可以參看Intents and Intent Filter文檔。聲明運(yùn)行程序所需的條件 Andorid系統(tǒng)可以支持很多不同的設(shè)備,并且這些設(shè)備的性能特征并不相同。為了防止你的程序被安裝在不能正常運(yùn)行你的程序的較低android系統(tǒng)版本上,通過(guò)在manifest文件中聲明你的程序支持的設(shè)備和軟件,便變得尤其重要起來(lái)。大多數(shù)的這些聲明僅是一些信息,而系統(tǒng)并不會(huì)讀取它們,但是其他的服務(wù)比如An
21、droid Market卻會(huì)閱讀這些聲明來(lái)幫助通過(guò)通過(guò)自己的設(shè)備搜索軟件的用戶過(guò)濾軟件。 比如,你的程序需要照相機(jī),并且使用的Android2.1的APIs,那么你就必須在你的manifest文件中聲明這些需要。這樣的話,在Android Market上,沒(méi)有照相機(jī)或者Android系統(tǒng)版本低于2.1將不能安裝你的程序。 然而,如果你的程序不需要照相機(jī),你仍可以聲明你需要照相機(jī)。這種情況下,你的程序必須在運(yùn)行時(shí)做一下檢查,來(lái)檢查這個(gè)設(shè)備是否含有照相機(jī),如果沒(méi)有照相機(jī)可用,則系統(tǒng)將會(huì)使使用照相機(jī)的相關(guān)程序不能用。 是一些你在設(shè)計(jì)和開(kāi)發(fā)你的程序時(shí),必須要考慮的關(guān)于設(shè)備的一些重要方面:屏幕大小和分辨
22、率為了根據(jù)屏幕的類型進(jìn)行分類,Android定義了兩個(gè)特征:屏幕大小和分辨率。 屏幕尺寸有:小,中,大,超大; 屏幕分辨率類型:低分辨率,中分辨率,高分辨率,超高分辨率; 默認(rèn)情況下,你的程序可以兼容所有的屏幕尺寸和分辨率,因?yàn)锳ndroid系統(tǒng)對(duì)你的程序的UI布局和image資源做了適當(dāng)?shù)恼{(diào)整。輸入方式: 很多設(shè)備有不同類型的輸入方式,比如鍵盤、軌跡球、五類的導(dǎo)航。如果你的程序需要某特定形式的輸入方式,則你必須在manifes文件中使用<uses-configuration>標(biāo)簽來(lái)聲明。不過(guò)這種情況是比較少的。設(shè)備配置: 有許多硬件或軟件并不全在Android系統(tǒng)的設(shè)備上,比如,
23、一個(gè)照相機(jī)、光線傳感器、某個(gè)版本的 OpenGL,或者屏幕的保真度(fidelity)。你在任何條件下都不能假定Android設(shè)備具備某種特性(feature)(當(dāng)然得除掉Android標(biāo)準(zhǔn)庫(kù)的情況),所以如果你的程序使用了某feature,則你必須使用<uses-feature>標(biāo)簽來(lái)聲明。 平臺(tái)版本不同的Android平臺(tái)設(shè)備通常運(yùn)行不同版本的Android,比如 Android 1.6或者Android 2.3。每個(gè)后續(xù)版本通常包含之前版本所不支持的新增API。為了表明哪組APIS可用, 每個(gè)平臺(tái)版本對(duì)應(yīng)一個(gè)API Level(例如, Android 1.0 對(duì)應(yīng)于API L
24、evel 1 ,Android 2.3 對(duì)應(yīng)于API Level 9)。如果你使用任何在 1.0 版之后平臺(tái)新增的API,你應(yīng)該使用<uses-sdk>元素聲明最低API Level 是包含這些API的。 為你的應(yīng)用程序聲明這些要求是至關(guān)重要,因?yàn)?,?dāng)你在 Android Market上發(fā)布你的應(yīng)用程序時(shí),Market使用這些聲明來(lái)過(guò)濾該應(yīng)用程序是否對(duì)于每臺(tái)設(shè)備可用。這樣,你的應(yīng)用程序僅對(duì)能夠滿足你的應(yīng)用程序要求的設(shè)備可用。應(yīng)用程序資源 一個(gè)應(yīng)用程序不僅僅由代碼組成它需要區(qū)別于源代碼的資源,比如圖片,音頻文件,以及任何與應(yīng)用程序視覺(jué)呈現(xiàn)相關(guān)聯(lián)的內(nèi)容。例如,你應(yīng)該使用XML文件定義動(dòng)
25、畫(huà),菜單,風(fēng)格,顏色,以及activity用戶界面的布局。使用應(yīng)用程序資源文件,可以更容易地更新你的應(yīng)用程序的特性而無(wú)需修改代碼,并且通過(guò)提供多套可替換資源文件使您能夠針對(duì)各種設(shè)備配置優(yōu)化你的應(yīng)用程序(比如不同語(yǔ)言或屏幕大小)。 對(duì)于你的安卓工程里面包含的每一項(xiàng)資源,SDK構(gòu)建工具定義一個(gè)唯一的正整數(shù)ID標(biāo)識(shí)符,你可以使用該標(biāo)識(shí)符從你的應(yīng)用程序代碼中或者從XML文件中定義的其他資源中特指該資源。例如,如果你的應(yīng)用程序中包含一個(gè)名為logo.png圖片文件(保存在res/drawable/文件夾里),SDK工具會(huì)生成一個(gè)資源ID命名為R.drawable.logo,你可以使用該ID特指這張圖片并
26、插入你的用戶界面中。 將資源提供工作同你的源代碼分隔開(kāi)來(lái)最重要的原因之一是能夠使您為不同的設(shè)備配置提供可替換的資源文件。例如,在XML中定義UI字符串,你可以將這些字符串翻譯成其他語(yǔ)言并保存在特定的文件夾中。然后,基于語(yǔ)言修飾詞,你添加資源文件夾名稱 (比如res/values-fr/應(yīng)于法語(yǔ)字符串) 以及用戶語(yǔ)言設(shè)置,Android 系統(tǒng)會(huì)給你的UI提供適當(dāng)?shù)恼Z(yǔ)言字符串。 對(duì)于可替代資源,Android 支持許多不同的修飾符。修飾符是包含在你的資源文件夾名稱中的一個(gè)短字符串,以便界定哪些設(shè)備配置可使用這些資源。另一個(gè)例子,對(duì)于不同的設(shè)備屏幕和大小,你應(yīng)當(dāng)為你的activities創(chuàng)建不同的布
27、局。例如,當(dāng)設(shè)備屏幕是縱向的 (高),你可能希望一個(gè)按鈕垂直排列的布局,但當(dāng)屏幕是橫向的(寬),按鈕應(yīng)當(dāng)水平排列。為了根據(jù)方向調(diào)整布局,你可以定義兩個(gè)不同的布局文件并給每個(gè)布局文件夾提供適當(dāng)?shù)男揎椃_@樣,系統(tǒng)會(huì)根據(jù)特定的設(shè)備方向自動(dòng)為其提供適當(dāng)?shù)牟季?。?章開(kāi)始入手本章內(nèi)容1.如何安裝Android SDK、創(chuàng)建開(kāi)發(fā)環(huán)境和試調(diào)項(xiàng)目2.理解移動(dòng)設(shè)計(jì)中的一些注意事項(xiàng)3.針對(duì)速度和效率進(jìn)行優(yōu)化的重要性4.針對(duì)小屏幕設(shè)備及移動(dòng)數(shù)據(jù)連接進(jìn)行優(yōu)化的重要性5.使用Android虛擬設(shè)備、模擬器和其他開(kāi)發(fā)人員工具 只要擁有一份Android SDK的副本和一個(gè)Java開(kāi)發(fā)包,你就可以開(kāi)始開(kāi)發(fā)自己的Andro
28、id 應(yīng)用程序了。除非你是一個(gè)自甘受苦的受虐狂,否則就需要一個(gè)Java IDE來(lái)讓開(kāi)發(fā)過(guò)程變得容易一些Eclipse尤其是個(gè)不錯(cuò)的選擇。 Windows、Mac和Linux等操作系統(tǒng)下都有各自可用的SDK、JDK和Eclipse版本,所以你可以在任何喜歡的操作系統(tǒng)下對(duì)Android進(jìn)行探索。SDK工具和模擬器在三張OS環(huán)境下都可以正常使用,因?yàn)锳ndroid應(yīng)用程序是運(yùn)行在一個(gè)Dalvik虛擬機(jī)上的,所以在任何特定的操作系統(tǒng)下開(kāi)發(fā)Android應(yīng)用程序都沒(méi)有明顯優(yōu)勢(shì)。Android代碼使用Java編寫(xiě)的語(yǔ)法,其Android核心庫(kù)包括最核心Java api的功能。在您可以運(yùn)行您的項(xiàng)目之前,您必
29、須將其轉(zhuǎn)化為Dalvik字節(jié)碼。因此,你熟悉的Java語(yǔ)法而VM上運(yùn)行您的應(yīng)用程序獲得的優(yōu)勢(shì)為移動(dòng)設(shè)備進(jìn)行了優(yōu)化。Android SDK起動(dòng)包包含SDK平臺(tái)工具,包括SDK管理器,需要下載并安裝SDK包的其余部分。Android SDK Manager 用;來(lái)下載Android 框架SDK庫(kù)、可選的曾件(包括Google API和支持包)、完整的文檔以及優(yōu)秀的示例應(yīng)用程序。他還包含了可以幫助你編寫(xiě)和調(diào)試應(yīng)用程序的工具,如運(yùn)行項(xiàng)目的Android模擬器和幫助調(diào)試的Dalvik調(diào)試監(jiān)控服務(wù)(Dalvik Dedug Monitoring Service,DDMS).學(xué)完這一章后,你應(yīng)該懂得下載了A
30、ndroid SDK starter package,并打開(kāi)它安卓了SDK和SDK的附件、平臺(tái)工具、文檔和示例代碼。你會(huì)設(shè)置開(kāi)發(fā)環(huán)境,建立你的Hello World應(yīng)用程序,并且能用Android虛擬機(jī)和DDMS運(yùn)行及調(diào)試該程序。如果你有移動(dòng)開(kāi)發(fā)的經(jīng)驗(yàn),那么肯定知道了它們較小的外形因素、有限的電量以及有限的處理能力和內(nèi)存會(huì)給設(shè)計(jì)帶來(lái)一些獨(dú)特的挑戰(zhàn)。即使是這方面的新手,也難看出桌面計(jì)算機(jī)或者Web的一些特征是手機(jī)所不具備的。除了硬件上的限制外,用戶環(huán)境也是設(shè)計(jì)者需要考慮的東西。移動(dòng)設(shè)備經(jīng)常會(huì)在移動(dòng)中使用,而且不會(huì)被我們注意到,所以應(yīng)用程序應(yīng)該運(yùn)行速度快,反應(yīng)流暢并且容易使用。幾時(shí)應(yīng)用程序是針對(duì)讓
31、人長(zhǎng)時(shí)間集中注意力的設(shè)備(如平臺(tái)電腦或者電視)設(shè)計(jì)的,剛才舉例的設(shè)計(jì)原則對(duì)于提供高質(zhì)量的用戶體驗(yàn)也是十分關(guān)鍵的。本章蔣研究一些Android應(yīng)用程序開(kāi)發(fā)的最佳實(shí)踐,來(lái)幫助你應(yīng)對(duì)移動(dòng)開(kāi)發(fā)中國(guó)的硬件和環(huán)境方面的挑戰(zhàn)。我們將討論如何按照與良好的移動(dòng)設(shè)計(jì)原則一致的方式使用Android SDK,而不是嘗試涉及所有內(nèi)容。2.1 Android的開(kāi)發(fā) Android SDK包含編寫(xiě)引人注目的和強(qiáng)大的移動(dòng)應(yīng)用程序需要的所有工具和api。與學(xué)習(xí)其他開(kāi)發(fā)包一樣,API的功能和局限是學(xué)習(xí)Android的最大挑戰(zhàn)。 如果你有Java經(jīng)驗(yàn)的開(kāi)發(fā),您將找到接手人的技巧,語(yǔ)法,和語(yǔ)法你已經(jīng)使用會(huì)直接轉(zhuǎn)化為Android,
32、盡管一些具體的優(yōu)化技術(shù)似乎是違反直覺(jué)的。 如果你沒(méi)有Java經(jīng)驗(yàn)的開(kāi)發(fā),但是用過(guò)其他的語(yǔ)言(如C#),那么你應(yīng)該發(fā)現(xiàn)這種轉(zhuǎn)變也很容易。Android的強(qiáng)大功能來(lái)自于它的API,而不是來(lái)自于Jvaa,所以即使你不熟悉所有的Java特定類,這也不會(huì)成為你的劣勢(shì)。2.1.1 開(kāi)始前的工作 因?yàn)锳ndroid應(yīng)用程序是運(yùn)行在Dalvik虛擬機(jī)上的,所以可以在任何支持所需的開(kāi)發(fā)人員工具的平臺(tái)上編寫(xiě)這些程序。當(dāng)前的平臺(tái)包括: (1)Microsoft Windows XP(或更高版本)(2)Mac OS X 10.5.8或更高版本(僅英特爾芯片)(3)Linux(包括GNU C庫(kù)2.7或更高版本)首先,你
33、需要下載并安裝如下:(1)Android SDK starter package(2)Java Development Kit (JDK) 5或 6你可以在Sun的網(wǎng)站上下載最新的JDK:downloads/index.jsp 很多時(shí)候,還需要安裝一個(gè)IDE。接下來(lái)的小節(jié)將介紹如何安裝Android SDK,而且使用Eclipse作為Android IDE.1. 下載和安裝Android SDK可以免費(fèi)下載和使用API,而且Google也不會(huì)因?yàn)槟阍贕oogle Paly Store發(fā)布完成的應(yīng)用程序而向你收費(fèi)或要求你提供應(yīng)用程序的評(píng)估結(jié)果。如果要在Google Paly Store上發(fā)布應(yīng)用
34、程序,需要一次性地支付很少的費(fèi)用。如果不打算通過(guò)Google Paly Store發(fā)布程序,那么連這筆很小的費(fèi)用也不用支付了??梢詮腁ndroid開(kāi)發(fā)主頁(yè)上下載格式你的開(kāi)發(fā)平臺(tái)的SDK starter packge的最新版本:starter packge被封裝在一個(gè)ZIP文件中,其中只包含下載Android SDK包其余部分所需要的Android開(kāi)發(fā)工具的最新版本。通過(guò)把SDK解壓到一個(gè)新文件夾中就可以安裝到計(jì)算機(jī)中了(注意它的安裝位置,后面還會(huì)用到它)。在開(kāi)始開(kāi)發(fā)之前,必須至少下載一個(gè)SDK平臺(tái)。為此,在Windows中可以運(yùn)行SDK Manager.exe可執(zhí)行文件,而Mac OS或Lin
35、ux中則可以運(yùn)行sarter packge下載文件的tools子文件夾中的android可執(zhí)行文件。所出現(xiàn)的屏幕(如圖2-1所示)顯示了此次可以下載的每個(gè)包。其中包括對(duì)應(yīng)平臺(tái)工具、每個(gè)平臺(tái)版本和一組ertra(例如Android Support Package和收費(fèi)許可包)的節(jié)點(diǎn)。圖2-1 展開(kāi)每個(gè)平臺(tái)版本節(jié)點(diǎn)后,可以看到一個(gè)列表,其中列出了該版本中所包含的包,包括開(kāi)發(fā)工具、文檔和示例代碼包。下載時(shí),首先要選中對(duì)應(yīng)于最新的框架SDK和最新版本的工具。兼容支持包、文檔和示例代碼的復(fù)選框。為使用Google API(其中包括地圖API),還需要在支持的平臺(tái)版本下選中Google APIs by G
36、oogle包。單機(jī)Install Package按鈕時(shí),所選的包蔣下載到SDK安裝文件夾。所得結(jié)果就是一些框架API庫(kù)、文檔和幾個(gè)示例應(yīng)用程序。2.下載和安裝SDK更新當(dāng)所有新的Android框架SDK、開(kāi)發(fā)工具、示例代碼、文檔、兼容庫(kù)和第三方曾件可用時(shí),可以使用Android SDK Manager下載和安裝這些更新。在以后下載的所有包和更新都將下載到相同的SDK位置。3.使用Eclipse 本書(shū)提供的示例和對(duì)每個(gè)步驟的說(shuō)明都是面向使用Eclipse和Android開(kāi)發(fā)工具(Android Developer Tools ,ADT)插件的開(kāi)發(fā)人員的。不過(guò)這兩者都不是必需的可以使用任何喜歡的文
37、本編輯器或者Java IDE,并且使用SDK中的開(kāi)發(fā)工具來(lái)編譯、測(cè)試和調(diào)試代碼段和示例程序。使用具有DT插件的Eclipse進(jìn)行Android開(kāi)發(fā)是一種備受推薦的方法,而這種方法確實(shí)具有一些重要的優(yōu)勢(shì),這些主要是通過(guò)IDE中緊密集成了許多Android構(gòu)建和調(diào)試工具實(shí)現(xiàn)的。Eclipse是一個(gè)開(kāi)源的IDE(Integrated Development Environment,集成開(kāi)發(fā)環(huán)境),在Java開(kāi)發(fā)中非常流行。從Eclipse組織的主頁(yè)上可以下載到支持Android的每個(gè)開(kāi)發(fā)平臺(tái)(Windows、Mac OS、Linux)的Eclipse安裝包: /down
38、loads。在選擇需要下載的Eclipse的時(shí)候,有很多可選的選項(xiàng),其中Eclipse3.5(Galileo)及更高版本要求使用ADT插件。下面是本書(shū)中使用的Android配置:(1)Eclipse 3.7 (Indigo) (Eclipse Classic 下載)(2)Eclipse Java Development Tools (JDT) 插件(3)Web Standard Tools (WST)大部分Eclipse IDE包中都包含WST和JDT插件。安裝Eclipse時(shí),需要把下載好的壓縮包解壓到一個(gè)新文件夾中。當(dāng)這一步完成之后,運(yùn)行eclipse可執(zhí)行文件。當(dāng)它第一次啟動(dòng)時(shí),為And
39、roid開(kāi)發(fā)項(xiàng)目創(chuàng)建一個(gè)新的工作空間。4.使用Eclipse的ADT插件 Eclipse的ADT插件通過(guò)把包括模擬器、.clays-to-.dcx轉(zhuǎn)換器等開(kāi)發(fā)工具直接集成到IDE中來(lái)簡(jiǎn)化Android開(kāi)發(fā)。雖然并非必須使用ADT插件,但是它確實(shí)可以讓?xiě)?yīng)用程序的開(kāi)發(fā)、側(cè)試和調(diào)試過(guò)程變得更加快速和簡(jiǎn)單。 ADT捅件把以下功能集成到了Eclipse中: (1)Android項(xiàng)目向?qū)?,它?jiǎn)化了創(chuàng)建新項(xiàng)目的過(guò)程,而且包含了一個(gè)基本的應(yīng)用程序模板。 (2)基于窗體的manifest文件、布局和資源編輯器可以幫助創(chuàng)建、編輯和驗(yàn)證XML資源。 (3)自動(dòng)地構(gòu)建Android項(xiàng)目,轉(zhuǎn)換為Android可執(zhí)行文科
40、.dex),打包為包文料(.apk),并把包安裝到Dalvik虛擬機(jī)(可運(yùn)行在模擬器上或者實(shí)際設(shè)備中)上。 (4)Android虛擬設(shè)備管理器允許為運(yùn)于到特定版本的Android OS、并且具有設(shè)定的硬件和內(nèi)存限制的模擬器創(chuàng)建和管理駐留它們的虛擬設(shè)備。 (5)Android模擬器,包括控制模擬器外觀、網(wǎng)絡(luò)連接設(shè)置以及模擬來(lái)電和SMS消息的能力。 (6)Dalvik調(diào)試監(jiān)控服務(wù)(Dalvik Debug Monitoring Service.,DDMS),包括:端口轉(zhuǎn)發(fā)(portforwarding).棧、堆和線程查看,進(jìn)程細(xì)節(jié)和屏幕捕捉功能。 (7)訪問(wèn)設(shè)備或者模擬器的文件系統(tǒng),允許瀏覽目錄樹(shù)
41、和轉(zhuǎn)移文件。 (8)運(yùn)行時(shí)調(diào)試.這樣就可以設(shè)置斷點(diǎn)和查看調(diào)用棧。 (9)所有的Android/Dalvik日志和控制臺(tái)輸出。圖2-2顯示的是安裝了ADT插件的Eclipse中的DDMS視圖。圖2-2安裝ADT插件按服以下步驟安裝ADT插件:(1)從Eclipse中選擇HelpInstall New Software選項(xiàng)。(2)在彈出的Available Software對(duì)話框中.單擊Add按鈕。(3)在下一個(gè)對(duì)話框的Name字段中,輸入便于記憶的名稱(例如Android Developer Tools),并在Locati文本框中輸入下面的地址: (4)點(diǎn)擊OK按鈕后,Eclipse將會(huì)搜索AD
42、T抽件。搜索完成以后,它將顯示可用的插件,如圖2-3所示。單擊Developer Tools根節(jié)點(diǎn)旁邊的復(fù)選框進(jìn)行選擇.然后單擊Next按鈕。 (5)現(xiàn)在Eclipse會(huì)下載該插件.當(dāng)下載完成后,會(huì)顯示一個(gè)開(kāi)發(fā)工具列表供查看。單擊Next按鈕。 (6)閱讀許可協(xié)議的條款之后選擇Accept,然后單擊Next和Finish按鈕。由于ADT插件沒(méi)有簽名,所以在安裝過(guò)程繼續(xù)之前會(huì)有提示。 (7)當(dāng)安裝完成之后,必須重新啟動(dòng)Eclipse并且更新ADT的參數(shù).重新啟動(dòng)后選擇Window Preferences(在Mac OS下是選擇EclipseIPreferences)。 (8)然后從左邊的面板中選
43、擇Android。 (9)單擊Browse按鈕,找到你安裝Android SDK的文件夾,然后單擊Apply按鈕。列表將會(huì)得到更新,并顯示每個(gè)可用的107;4目標(biāo),如圖2-4所示。單擊OK按鈕完成SDK的安裝過(guò)程。圖2-4更新ADT插件大部分情況下,要更新ADT插件,只需要:(1)選擇HelpCheck for Updates選項(xiàng)。(2)如果存在任何可用的ADT更新,則它們就會(huì)被顯示出來(lái)。選定它們,然后選擇Install即可。5.使用支持包 支持庫(kù)包(原來(lái)叫做兼容庫(kù))是一個(gè)靜態(tài)庫(kù)的集合,把它們包含到項(xiàng)目中以后.就可以使用框架不包含的便捷API(例如view Pagcr),或者并不是每個(gè)平臺(tái)都可
44、用、但是非常方便的API(例如Fragmcn)。支持包允許在運(yùn)行Android 1.6(API level 4)或更高版本的任何設(shè)備上使用Android近期版本中引入的API功能。這樣,開(kāi)發(fā)人員就可以提供分一致的用戶體驗(yàn),并且由于不必支持多個(gè)平臺(tái)版本,他們的開(kāi)發(fā)過(guò)程也可以簡(jiǎn)化。為在項(xiàng)目中包含支持庫(kù),需要執(zhí)行以下步驟:(1)在項(xiàng)目的根目錄下添加一個(gè)新的/libs文件夾。(2)從Android SDK安裝目錄的/extras/android/support/文件夾中復(fù)制支持庫(kù)JAR文件。注意Support文件夾中包含多個(gè)子文件夾,每個(gè)子文件夾代表該庫(kù)支持的最低平臺(tái)版本。只需要找到所代表的版本小于或
45、等于你想要支持的最低平臺(tái)版本的子文件夾,并使用其中包含的對(duì)應(yīng)JAR文件即可。例如,如果你想支持從Android 1.6(API level 4)往上的所有平臺(tái)版木,就應(yīng)該復(fù)制v4/android-support-v4 jar。(3)把該文件復(fù)制到項(xiàng)目的/libs文件夾后,在Package Explorer中右擊,并選擇Build PathAdd to Build Path,把該文件添加到項(xiàng)目的構(gòu)建路徑中。2.1.2 創(chuàng)建第一個(gè)Android應(yīng)用程序 在下載了SDK并安裝了Eclipse和插件之后,現(xiàn)在可以開(kāi)始為Android編寫(xiě)程序了。首先,創(chuàng)建一個(gè)新的項(xiàng)目,并設(shè)置Eclipse的運(yùn)行和調(diào)試配
46、置。具體步驟如以下小節(jié)所示。1. 創(chuàng)建一個(gè)新的Android項(xiàng)目 可以使用Android New Project Wizard創(chuàng)建一個(gè)新的Android項(xiàng)目,操作步驟如下: (1)選擇FileNewProject選項(xiàng)。 (2)從Android文件夾中選擇Android Project應(yīng)用類型,然后單擊Next按鈕。 (3)在出現(xiàn)的向?qū)е休斎胄马?xiàng)目的詳細(xì)情況。在向?qū)У牡谝豁?yè)(如圖2-5所示)中,Project Name是項(xiàng)目文件的名稱。在這里還可以選擇項(xiàng)目的保存位置。(4)向?qū)У南乱粋€(gè)頁(yè)面(如圖2-6所示)允許選擇應(yīng)用程序的構(gòu)建目標(biāo)。構(gòu)建目標(biāo)指的是開(kāi)發(fā)應(yīng)用程序時(shí)計(jì)劃使用的Android框架SDK
47、的版本。除了包含在每個(gè)平臺(tái)版本中的開(kāi)源的Android SDK庫(kù),Google還提供了一套專有的API,以允許開(kāi)發(fā)人員使用額外的庫(kù)(例如Google地圖)。如果想使用這些Google專有的API,必須選擇對(duì)應(yīng)于目標(biāo)平臺(tái)的Google APIs包。圖2-5圖2-6(5)向?qū)У淖詈笠粋€(gè)頁(yè)面(如圖2-7所示)可以指定應(yīng)用程序的屬性。Application Name是應(yīng)用程序的名稱:Package Name指定了它的Java包:Create Activity用于指定初始Activity類的名稱。Minimum SDK用于指定運(yùn)行應(yīng)用程所需的最低SDK版本。圖2-7(6)輸入這終內(nèi)容之后,單擊Finis
48、h按鈕。如果選中了Create Activity,那么ADT插件將創(chuàng)建一個(gè)新項(xiàng)目,該項(xiàng)目包含一個(gè)擴(kuò)展了Activity的類。默認(rèn)模板并不完全為空,而是實(shí)現(xiàn)了Hello World程序。在修改項(xiàng)目以前,可以利用這個(gè)機(jī)會(huì)為運(yùn)行和試調(diào)應(yīng)用程序配置啟動(dòng)選項(xiàng)。2.創(chuàng)建一個(gè)Android虛擬設(shè)備 Android虛擬設(shè)備(AVD)用于模擬不同Android設(shè)備的硬件和軟件配置,使開(kāi)發(fā)人員能夠在各種硬件平臺(tái)上測(cè)試應(yīng)用程序。 Android SDK中不包含預(yù)建的AVD,所以如果沒(méi)有實(shí)際的設(shè)備,你必須創(chuàng)建至少一個(gè)AVD,然后才運(yùn)行和調(diào)試應(yīng)用程序。 (1)選擇WindowAVD Manager(或者選擇Eclips
49、e工具欄上的AVD Manager圖標(biāo))。 (2)選擇New按鈕。 顯示的Create new Android Virtual Device(AVD)對(duì)話框允許配置AVD的名稱、Android構(gòu)建目標(biāo)、SD卡的容量和設(shè)備的皮膚。 (3)創(chuàng)建一個(gè)針對(duì)Android 4.0.3的新AVD,命名為My-AVD。將該AVD設(shè)為包含一個(gè)16MB的SD卡,并使用Galaxy Nexus皮膚,如圖2-8所示。(4)單擊Create AVD,新的AVD就會(huì)創(chuàng)建完成并等待使用。圖2-82. 創(chuàng)建一個(gè)啟動(dòng)配置 啟動(dòng)配置允許指定運(yùn)行和調(diào)試應(yīng)用程序的運(yùn)行時(shí)選項(xiàng)。通過(guò)使用啟動(dòng)配置,可以指定: (1)要啟動(dòng)的項(xiàng)目和Act
50、ivity (2)部署目標(biāo)(虛擬設(shè)備或?qū)嶋H設(shè)備) (3)模擬器的啟動(dòng)參數(shù) (4)輸入/輸出設(shè)置(包括默認(rèn)的控制臺(tái)) 可以為運(yùn)行和調(diào)試應(yīng)用程序指定不同的啟動(dòng)配置。下面的步驟詳細(xì)說(shuō)明了如何為Android應(yīng)用程序創(chuàng)建一個(gè)啟動(dòng)配置: (1)選擇Run Configurations(或者選擇Debug Configurations)選項(xiàng)。 (2)在項(xiàng)目類型列表的Android Application節(jié)點(diǎn)下選擇應(yīng)用程序,或者右擊Android Application并選擇New命令。 (3)輸入配置的名稱??蔀槊恳粋€(gè)項(xiàng)目創(chuàng)建多個(gè)配置,因此需要?jiǎng)?chuàng)建一個(gè)其有描述性的名稱,從而可以幫助識(shí)別這個(gè)特定的設(shè)置。 (
51、4)選擇啟動(dòng)選項(xiàng)。在第一個(gè)(Android)選項(xiàng)卡中可以選擇當(dāng)運(yùn)行(或者調(diào)試)應(yīng)用程序的時(shí)候希望啟動(dòng)的項(xiàng)目和Activity。圖2-9顯示了之前創(chuàng)建的項(xiàng)目的設(shè)置。(5)可以使用圖2-10中所示的Target選項(xiàng)卡來(lái)選擇默認(rèn)啟動(dòng)的虛擬設(shè)備,也可以選擇Manual,在每次運(yùn)行應(yīng)用程序時(shí)選中一個(gè)實(shí)際設(shè)備或一個(gè)虛擬設(shè)備。此外,還可以配置模擬器的網(wǎng)絡(luò)連接設(shè)置,以及選擇是否刪除用戶數(shù)據(jù)和是否禁用開(kāi)機(jī)動(dòng)畫(huà)。圖2-9圖2-10(6)最后在Common選項(xiàng)卡中設(shè)置其他所有屬性。(7)單擊Apply按鈕,以便保存啟動(dòng)配置。4.運(yùn)行和調(diào)試Android應(yīng)用程序在前面的內(nèi)容中,已經(jīng)創(chuàng)建了第一個(gè)項(xiàng)目,并且為它創(chuàng)建了運(yùn)行
52、和調(diào)試配置。在對(duì)Hello World項(xiàng)目進(jìn)行修改之前,可以通過(guò)運(yùn)行和調(diào)試該項(xiàng)目來(lái)測(cè)試安裝和項(xiàng)目配置情況。從Run菜單中選擇Run或者Debug選項(xiàng)來(lái)啟動(dòng)最近選擇的配置,或者通過(guò)選擇Run Configurations.或者Debug Configurations選項(xiàng)來(lái)選擇一個(gè)特定配置。如果正在使用ADT插件,那么運(yùn)行和調(diào)試應(yīng)用程序?qū)⑼瓿梢韵鹿ぷ?(1) 編譯當(dāng)前項(xiàng)目,并將其轉(zhuǎn)換為 Android可執(zhí)行文件(.dex)。(2) 把可執(zhí)行文件和外部資源打包為Android包(.apk)。(3) 啟動(dòng)你選擇的虛擬設(shè)備(如果你選擇了一個(gè)AVD,而它還沒(méi)有運(yùn)行)。(4) 把應(yīng)用程序安裝到目標(biāo)設(shè)備_L。
53、(5) 啟動(dòng)應(yīng)用程序。 如果正在進(jìn)行調(diào)試,那么Eclipse調(diào)試器就會(huì)允許設(shè)置斷點(diǎn)和調(diào)試代碼。如果一切進(jìn)展順利,那么將會(huì)看到一個(gè)新的Activity運(yùn)行在設(shè)備或模擬器上,如圖2-11所示。圖2-115.理解Hello World 我們回頭仔細(xì)分析第一個(gè)Android應(yīng)用程序。 Activity是應(yīng)用程序中可見(jiàn)的交互組件的基類,它大致上等同于傳統(tǒng)桌面應(yīng)用程序開(kāi)發(fā)中的窗體。第3章將詳細(xì)介紹Activity。程序清單2-1顯示了一個(gè)基于Activity的類的框架代碼。注意,它擴(kuò)展了Activity,重寫(xiě)了onCreate方法。程序清單 2-1: Hello Worldpackage com.paad
54、.helloworld;import android.app.Activity;import android.os.Bundle;public class MyActivity extends Activity /* Called when the Activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);在Android中,可視化組件稱為視圖(View)
55、,它們類似于傳統(tǒng)桌面應(yīng)用程序開(kāi)發(fā)中的控件。通過(guò)向?qū)?chuàng)建的Hello World模板中,因?yàn)閟etContentView可以通過(guò)擴(kuò)展一個(gè)布局資源來(lái)對(duì)用戶界面進(jìn)行布局,所以我們重寫(xiě)onCreate方法,用它來(lái)調(diào)用setContentVtew,參見(jiàn)下面高亮顯示的代碼:Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);Android項(xiàng)目的資源存儲(chǔ)在項(xiàng)目層次結(jié)構(gòu)的res文件夾中,它包含了layout、 values
56、和一系列drawable子文件夾。ADT插件會(huì)對(duì)這些資源進(jìn)行解釋,并通過(guò)R變量來(lái)提供對(duì)它們的設(shè)計(jì)時(shí)訪問(wèn)。有關(guān)R變量的相關(guān)內(nèi)容會(huì)在第3章講述。程序清單2-2顯示了定義在由Android項(xiàng)目模板創(chuàng)建、并存儲(chǔ)在項(xiàng)目的resflayout文件夾中的main.xml文件中的UI布局。程序清單2-2:Hello World layout resource<?xml version=”1.0” encoding=”utf-8”?><LinearLayout xmlns:android=”android:orientation=”vertical”android:layout_width=”
57、fill_parent”android:layout_height=”fill_parent”><TextViewandroid:layout_width=”fill_parent”Developing for Android x 35android:layout_height=”wrap_content”android:text=”string/hello”/></LinearLayout>使用XML定義UI井對(duì)其進(jìn)行擴(kuò)展是實(shí)現(xiàn)用戶界面(UI)的首選方法,因?yàn)檫@樣做可以把應(yīng)用程序邏輯和UI設(shè)計(jì)分離開(kāi)來(lái)。為了在代碼中訪問(wèn)UI元素,可以在XML定義中向它們添加標(biāo)識(shí)符屬性。之后就可以使用findViewById方法來(lái)返回對(duì)每個(gè)已命名的項(xiàng)的引用了。下面的XML代碼顯示了向Hello World
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京混凝土合同范本
- 各種合同范本app
- 廚房墻壁維修合同范本
- 種植水稻農(nóng)村土地出租合同范本
- 醫(yī)院租賃合同范本
- 發(fā)廊給干股 合同范本
- 買賣合同范本 中日
- 沖擊鉆合同范本
- 古董繼承合同范例
- 單位之間贈(zèng)與合同范例
- 機(jī)械設(shè)計(jì)基礎(chǔ)網(wǎng)考題庫(kù)答案 吉林大學(xué)
- 建筑垃圾回收利用統(tǒng)計(jì)臺(tái)賬
- 《不一樣的你我他》(完美)課件
- 新蘇教版科學(xué)六年級(jí)下冊(cè)全冊(cè)教案(含反思)
- 原油電脫鹽電脫水技術(shù)
- 國(guó)考斷面水站建設(shè)及運(yùn)維技術(shù)要求參考
- Q∕GDW 10799.7-2020 國(guó)家電網(wǎng)有限公司電力安全工作規(guī)程 第7部分:調(diào)相機(jī)部分
- 熱工學(xué)后題答案
- 不吸煙不喝酒課件
- 奧數(shù)知識(shí)點(diǎn) 間隔問(wèn)題
- 簡(jiǎn)易旋轉(zhuǎn)倒立擺及控制裝置
評(píng)論
0/150
提交評(píng)論