第1章Android開發(fā)基礎(chǔ)1.1 Eclipse中的Android開發(fā)Eclipse是著名的跨平臺開源集成開發(fā)環(huán)境,對開發(fā)Android應(yīng)用提供了良好的支持。1.1.1 創(chuàng)建項目在Eclipse中創(chuàng)建Android項目的步驟如下:①啟動Eclipse集成開發(fā)環(huán)境。②運行File→New→Android Application Project菜單命令,打開New Android Application向?qū)В@示如圖1-1所示界面。在New Android Application向?qū)е休斎肴缦滦畔ⅲ篈pplication Name:HelloWorldProject Name:HelloWorldPackage Name:com.liweiyong.helloworld(包的名稱必須和所有安裝在Android系統(tǒng)中的應(yīng)用程序的包名不相同)其他默認選擇如下:Minimum Required SDK:API 14Target SDK:API 18Compile With:API 19Theme:Holo Light with Dark Action Bar③單擊Next按鈕,默認Conf?igure Project設(shè)置和Conf?igure the attribute of the icon set界面設(shè)置,選擇BlankActivity,單擊Finish按鈕,完成Hello World項目的創(chuàng)建。圖1?1 New Android Application向?qū)?.1.2 創(chuàng)建AVDAndroid Virtual Device(簡稱AVD)是運行Android項目的虛擬設(shè)備。AVD通過對硬件和軟件的配置進行定義來模擬一個實際的設(shè)備。1.?創(chuàng)建SD Card映像文件Android模擬器自身已經(jīng)具備了一個持久化存儲空間,但這并不夠大,有時需要為應(yīng)用程序和文件提供更大的存儲空間。為了在模擬器上開發(fā)使用擴展存儲空間的程序,需要在PC上模擬一個SD Card(Secure Digital Memory Card,一種基于半導體快閃記憶器的新一代記憶設(shè)備)的虛擬文件,然后加載到模擬器中。創(chuàng)建SD Card虛擬文件的步驟如下:①在Windows中,運行“開始”→“運行”菜單命令,在打開的“運行”窗口中輸入“cmd”并單擊“確定”按鈕,打開命令行窗口。②在窗口中輸入如下命令:mksdcard -l mycard 500M C:\\mysdcard.img該命令的含義是在本地磁盤C盤創(chuàng)建一個500 MB大小的映像文件mysdcard.img。此時,查看C盤可以看到一個名稱為mysdcard.img的文件。2.?創(chuàng)建AVD并關(guān)聯(lián)SD Card在Eclipse中創(chuàng)建AVD并關(guān)聯(lián)SD Card的步驟如下:①在Eclipse中,運行Window→Android Virtual Device Manager菜單命令,打開Android Virtual Device Manager對話框。單擊對話框中的New按鈕,彈出如圖1-2所示的創(chuàng)建AVD對話框。在AVD Name文本框中輸入AVD的名稱(可以自定義)。Device用于設(shè)置模擬器的尺寸和分辨率。SDK提供的常見分辨率(sdk\platforms\android-#\skins\)包括:HVGA(320×480)、QVGA(320×240)、WQVGA400(400×240)、WQVGA432(432×240)、WVGA800(800×480)、WVGA854(854×480)和WXGA(1280×800)等。在Target中選擇需要的SDK版本(平板電腦開發(fā)的最低版本是Android API 11)。SD Card的大小可以自定義輸入數(shù)值;也可以選擇File單選按鈕后,單擊Browse按鈕,在打開的對話框中選擇前面創(chuàng)建的SD Card映像文件。其他默認設(shè)置即可。②單擊OK按鈕,完成AVD的創(chuàng)建。1.1.3 運行項目下面介紹在Eclipse中運行Android項目的方法,步驟如下:①在Eclipse的項目窗口中,右擊項目節(jié)點名稱HelloWorld,運行Run as→Run Conf?igurations菜單命令,打開Run Conf?igurations對話框。②在對話框的左側(cè)選擇Android Application,并單擊上方的New launch conf?iguration按鈕,在右側(cè)的Android標簽頁中單擊Browse按鈕,打開Project Selection對話框,選擇HelloWorld項目,如圖1-3所示。圖1?3 Run Conf?igurations對話框——選擇項目③在對話框的Target標簽頁中的AVD列表中勾選合適的Android模擬器,如圖1-4所示。單擊Apply和Run按鈕,運行程序。圖1?4 Run Conf?igurations對話框圖1-5顯示了項目的運行結(jié)果。圖1?5 項目運行結(jié)果1.2 Android項目架構(gòu)在Eclipse的Package Explorer窗口中展開HelloWorld項目,項目架構(gòu)如圖1-6所示。一個Android工程包含了組成Android應(yīng)用的所有源代碼文件。Android工程主要由src、gen、assets、res文件夾和AndroidManifest.xml等文件組成,下面分別對其進行解析。1.2.1 Java代碼解析Android項目的Java代碼主要存放在src文件夾和gen文件夾的包文件夾下。1.?MainActivity解析src文件夾用來存放項目的源代碼。在Package Explorer窗口中,展開項目的src文件夾,打開通過向?qū)傻腗ainActivity.java,核心代碼如下:01 public class MainActivity extends Activity {02 03 @Override04 protected void onCreate(Bundle savedInstanceState) {05 super.onCreate(savedInstanceState);06 setContentView(R.layout.activity_main);07 }08 09 @Override10 public boolean onCreateOptionsMenu(Menu menu) {11 getMenuInflater().inflate(R.menu.main, menu);12 return true;13 }14 15 }01行的MainActivity是一個用戶定義的Activity,繼承自android.app.Activity類。Activity是應(yīng)用程序的表示層,用于構(gòu)建應(yīng)用程序的UI界面。關(guān)于Activity的使用方法將在第3章介紹。03~07行重載的onCreate(Bundle)方法是Activity生命周期的組成部分,用于初始化Activity。例如界面的顯示內(nèi)容通過調(diào)用setContentView()方法來指定顯示布局,如activity_main.xml。然后通過f?indViewById(int)方法在布局中檢索需要交互的UI控件。04行的Bundle類用于Activity之間傳遞數(shù)據(jù)。該類提供了公有方法containKey(String key),如果給定的key包含在Bundle的映射中,則返回true,否則返回false。該類實現(xiàn)了Parceable和Cloneable接口,所以它具有這兩者的特性。05行的super.onCreate(savedInstanceState)方法的作用是調(diào)用父類中的onCreate()方法來實現(xiàn)對界面的繪制工作。注意,從savedInstanceState中讀取保存到存儲設(shè)備中的數(shù)據(jù)時,需要判斷savedInstanceState是否為null,因為Activity第一次啟動時并沒有數(shù)據(jù)被存儲在設(shè)備中。有關(guān)savedInstanceState的介紹參見3.4.4節(jié)。09~13行的onCreateOptionsMenu(Menu)方法是Activity中提供的用于創(chuàng)建菜單項的回調(diào)方法。通過其中的getMenuInflater().inflate(int,Menu)方法加載res/menu中定義的菜單資源。onCreateOptionsMenu(Menu)方法通常和OnOptionsMenuSelected(MenuItem)回調(diào)方法配合使用,以響應(yīng)菜單的選擇事件。2.?R. java解析打開gen/com.liweiyong.helloworld中的R.java文件,部分代碼如下:01 /* AUTO-GENERATED FILE.DO NOT MODIFY.02*03* This class was automatically generated by the04* aapt tool from the resource data it found.It05* should not be modif?ied by hand.06*/07 08 public f?inal class R {09 public static f?inal class array {10 public static f?inal int action_f?ile=0x7f040005;11 ...12 }13 public static f?inal class layout {14 public static f?inal int activity_main=0x7f030000;15 }16 ...17 }程序的第01~06行為注釋說明,R.java文件由aapt工具根據(jù)res中的資源自動生成,不要手動修改該文件。R.java由ADT根據(jù)res中的資源自動生成drawable、layout、string等靜態(tài)匿名內(nèi)部類。不同的靜態(tài)內(nèi)部類分別根據(jù)其res中的資源定義一系列資源標識符,如“public static f?inal int activity_main =0x7f030000;”對應(yīng)的是layout目錄下的activity_main.xml文件。每當res中的資源發(fā)生變化,aapt工具都會自動在R.java對應(yīng)的內(nèi)部類中生成一個靜態(tài)int類型的常量,以對新添加的資源進行索引。如果從res中刪除一個資源,R.java中對應(yīng)的索引也會自動刪除。通過R.java可以很快地查找需要的資源,另外編譯器也會檢查R.java列表中的資源是否被使用,沒有被使用到的資源不會編譯進apk中,這樣可以減少應(yīng)用在手機中占用的空間。3.?BuildConf?ig.?java解析打開gen/com.liweiyong.helloworld中的BuildConf?ig.java文件,代碼如下:01 /** Automatically generated f?ile. DO NOT MODIFY */02 package cn.liweiyong.helloworld;03 04 public f?inal class BuildConf?ig {05 public f?inal static boolean DEBUG = true;06 }ADT允許開發(fā)者只在調(diào)試模式下運行某些代碼。BuildConf?ig類包含一個DEBUG常量,該常量會根據(jù)Build類型自動設(shè)置值。可以通過BuildConf?ig.DEBUG常量來編寫只在Debug模式下運行的代碼。如果有些代碼不想在應(yīng)用發(fā)布后執(zhí)行,也可以使用該功能。