| Google Android手機在美亮相 能否一舉成功仍是未知數 |
| 2008/09/24 - 手機&網(wǎng)通 - 陳穎芃/綜合外電 |
|
據美聯(lián)社(AP)報導,醞釀已久的Google Android智能型手機終于要在23日于紐約亮相。市調機構Strategy Analytics預估,負責銷(xiāo)售的美國行動(dòng)電信業(yè)者T-Mobile在2008年能售出40萬(wàn)支Android手機,為Google取得美國智能型手機市場(chǎng)4%的市占率。 Android文檔閱讀01—Android是什么?許可協(xié)議:creativecommons licenses
Android是什么? Android是一個(gè)針對移動(dòng)設備的程序集, 其中包括一個(gè)操作系統, 一個(gè)中間件和一些關(guān)鍵性應用. 本文首先概覽了Android SDK提供的工具和APIs, 當您在使用Java語(yǔ)言來(lái)開(kāi)發(fā)Android平臺的應用時(shí)您會(huì )用到它們. 特性
Android的結構下圖展示了Android 操作系統的主要組件結構. 每一部分都在下面的段落有詳細介紹
應用程序Android會(huì )附帶一些核心的應用程序, 包括一個(gè)email客戶(hù)端, 短信程序, 日歷, 地圖, 瀏覽器, 通訊錄等等. 所有的應用程序都是由Java語(yǔ)言完成的. 應用程序框架Developers have full access to the same framework APIs used by the core applications. The application architecture is designed to simplify the reuse of components; any application can publish its capabilities and any other application may then make use of those capabilities (subject to security constraints enforced by the framework). This same mechanism allows components to be replaced by the user. 開(kāi)發(fā)人員可以跟那些核心應用一樣, 擁有訪(fǎng)問(wèn)框架APIs的全部權限. 應用的系結構設計簡(jiǎn)化了各組件之間的重用;任何應用都可以分發(fā)自己的組件, 任何應用也可以使用這些分發(fā)的組件(應用的使用方法需遵循框架的安全性約束)。這個(gè)機制對用戶(hù)來(lái)說(shuō)同樣適用, 他們也可以替換組件. 隱藏在每個(gè)應用后面的是一套服務(wù)和系統, 其中包括:
庫Android 包含一套C/C++庫, 被用于A(yíng)ndroid 系統中的各種組件中. 這些功能通過(guò)Android 應用框架展現給開(kāi)發(fā)人員. 下面列出一些核心庫:
Android 運行時(shí)Android包含一組核心庫, 提供了Java語(yǔ)言核心庫內的大部分功能.
Linux KernelAndroid基于Linux version 2.6內核來(lái)提供系統的核心服務(wù), 例如安全機制, 內存管理, 進(jìn)程管理, 網(wǎng)絡(luò )堆棧和驅動(dòng)模塊. 該內核還扮演著(zhù)一個(gè)虛擬的中間層, 該層介于硬件和其余的軟件堆棧. Android文檔閱讀02—解析Android程序許可協(xié)議:creativecommons licenses
在A(yíng)ndroid應用程序中有四個(gè)構建塊:
并不是每個(gè)程序都需要所有的四個(gè)部分,你的程序可能用到它們其中一些的組合。 一旦你決定在你的程序中需要哪個(gè)組件,你應該在一個(gè)叫AndroidManifest.xml的文件中列出它們。你在這個(gè)XML文件中聲明程序中用到的組件和它們的用途和需要。在Android manifest file 文檔中查閱完整的細節。
ActivityActivity是Android構造塊中最基本的一種,在應用中,一個(gè)activity通常就是一個(gè)單獨的屏幕。每一個(gè)activity都被實(shí)現為一個(gè)獨立的類(lèi),并且繼承于A(yíng)ctivity這個(gè)基類(lèi)。這個(gè)activity類(lèi)將會(huì )顯示由幾個(gè)Views控件組成的用戶(hù)接口,并對事件做出響應。大部份的應用都會(huì )包含多個(gè)的屏幕。例如,一個(gè)短消息應用程序將會(huì )有一個(gè)屏幕用于顯示聯(lián)系人列表,第二個(gè)屏幕用于寫(xiě)短消息,同時(shí)還會(huì )有用于瀏覽舊短消息及進(jìn)行系統設置的屏幕。每一個(gè)這樣的屏幕,就是一個(gè)activity。從一個(gè)屏幕導航到另一個(gè)屏幕是很簡(jiǎn)單的。在一些應用中,一個(gè)屏幕甚至會(huì )返回值給前一個(gè)屏幕。
當一個(gè)新的屏幕打開(kāi)后,前一個(gè)屏幕將會(huì )暫停,并保存在歷史堆棧中。用戶(hù)可以返回到歷史堆棧中的前一個(gè)屏幕。當屏幕不再使用時(shí),還可以從歷史堆棧中刪除。默認情況下,Android將會(huì )保留從主屏幕到每一個(gè)應用的運行屏幕。 Intent and Intent Filters
Android使用了Intent這個(gè)特殊類(lèi),實(shí)現在屏幕與屏幕之間移動(dòng)。Intent類(lèi)用于描述一個(gè)應用想要做什么事。在Intent的描述結構中,有兩個(gè)最重要的部分:動(dòng)作和動(dòng)作對應的數據。 典型的動(dòng)作類(lèi)型有:MAIN(activity的門(mén)戶(hù))、VIEW、PICK、EDIT等。而動(dòng)作對應的數據則以URI的形式進(jìn)行表示。例如:要查看一個(gè)人的聯(lián)系方式,你需要創(chuàng )建一個(gè)動(dòng)作類(lèi)型為VIEW的intent,以及一個(gè)表示這個(gè)人的URI。 Android利用一個(gè)叫Intent的特殊類(lèi)來(lái)實(shí)現屏幕間的切換。一個(gè)Intent描述了一個(gè)應用程序想要做什么。intent數據結構中兩個(gè)最重要的部分是動(dòng)作和動(dòng)作對應的數據。一個(gè)典型動(dòng)作的值是MAIN(活動(dòng)的入口),VIEW,PICK,EDIT,和其它一些。數據表示為URI。例如,瀏覽一個(gè)人的聯(lián)系信息,你應該創(chuàng )建一個(gè)帶有VIEW活動(dòng)的intent,并且URI的數據集指向那個(gè)人。
與之有關(guān)系的一個(gè)類(lèi)叫IntentFilter。相對于intent是一個(gè)有效的做某事的請求,一個(gè)intent filter則用于描述一個(gè)activity(或者Intent Receiver)能夠操作哪些intent。一個(gè)activity如果要顯示一個(gè)人的聯(lián)系方式時(shí),需要聲明一個(gè)IntentFilter,這個(gè)IntentFilter要知道怎么去處理VIEW動(dòng)作和表示一個(gè)人的URI。IntentFilter需要在A(yíng)ndroidManifest.xml中定義。
一個(gè)屏幕到另一個(gè)屏幕之間的導航是通過(guò)解析意圖(Intent)來(lái)實(shí)現的。當向前導航時(shí),activity將會(huì )調用startActivity (Intent myIntent)方法。然后,系統會(huì )在所有安裝的應用程序中定義的IntentFilter中查找,找到最匹配myIntent的 Intent對應的activity。新的activity接收到myIntent的通知后,開(kāi)始運行。當startActivity方法被調用將觸發(fā)解析 myIntent的動(dòng)作,這個(gè)機制提供了兩個(gè)關(guān)鍵好處:
Intent Receiver當你希望你的應用能夠對一個(gè)外部的事件(如當電話(huà)呼入時(shí),或者數據網(wǎng)絡(luò )可用時(shí),或者到了晚上時(shí))做出響應,你可以使用一個(gè)Intent Receiver。雖然Intent Receiver在感興趣的事件發(fā)生時(shí),會(huì )使用NotificationManager 通知用戶(hù),但它并不能生成一個(gè)UI。Intent Receiver在A(yíng)ndroidManifest.xml中注冊,但也可以在代碼中使用 Context.registerReceiver()進(jìn)行注冊。當一個(gè)intent receiver被觸發(fā)時(shí),你的應用不必對請求調用intent receiver,系統會(huì )在需要的時(shí)候啟動(dòng)你的應用。各種應用還可以通過(guò)使用Context.broadcastIntent()將它們自己的 intent receiver廣播給其它應用程序。 Service一個(gè)Service是一段長(cháng)生命周期的,沒(méi)有用戶(hù)界面的程序。比較好的一個(gè)例子就是一個(gè)正在從播放列表中播放歌曲的媒體播放器。在一個(gè)媒體播放器的應用中,應該會(huì )有多個(gè)activity,讓使用者可以選擇歌曲并播放歌曲。然而,音樂(lè )重放這個(gè)功能并沒(méi)有對應的activity,因為使用者當然會(huì )認為在導航到其它屏幕時(shí)音樂(lè )應該還在播放的。在這個(gè)例子中,媒體播放器這個(gè)activity會(huì )使用Context.startService()來(lái)啟動(dòng)一個(gè)service,從而可以在后臺保持音樂(lè )的播放。同時(shí),系統也將保持這個(gè)service一直執行,直到這個(gè)service運行結束。另外,我們還可以通過(guò)使用Context.bindService()方法,連接到一個(gè)service上(如果這個(gè)service還沒(méi)有運行將啟動(dòng)它)。當連接到一個(gè)service之后,我們還可以service提供的接口與它進(jìn)行通訊。拿媒體播放器這個(gè)例子來(lái)說(shuō),我們還可以進(jìn)行暫停、重播等操作。 Content Provider應用程序能夠將它們的數據保存到文件中、SQL數據庫中,甚至是任何有效的設備中。當你想將你的應用數據與其它的應用共享時(shí),Content Provider將會(huì )很有用。一個(gè)Content Provider類(lèi)實(shí)現了一組標準的方法,從而能夠讓其它的應用保存或讀取此Content Provider處理的各種數據類(lèi)型。 更詳細的Content Provider資料,可以參考附帶文檔中的Accessing Content Providers。
Android文檔閱讀03—開(kāi)發(fā)工具許可協(xié)議:creativecommons licenses
Android SDK包含了在A(yíng)ndroid平臺上開(kāi)發(fā)移動(dòng)應用的各種工具集。它不僅包括了Android模擬器和用于Eclipse的Android開(kāi)發(fā)工具插件(ADT),而且包括了各種用來(lái)調試、打包和在模擬器上安裝應用的工具。 Android EmulatorAndroid模擬器:一個(gè)運行在電腦上的手機模擬器。你可以使用這個(gè)模擬器,在真實(shí)的Android運行環(huán)境中去設計、調試和測試自己開(kāi)發(fā)的應用程序。 Android Development Tools Plugin for the Eclipse IDE用于Eclipse集成開(kāi)發(fā)環(huán)境的Android應用開(kāi)發(fā)工具插件:它為Eclipse集成開(kāi)發(fā)環(huán)境增加了強大的功能,使得創(chuàng )建和調試Android應用程序更加簡(jiǎn)單和快速。如果你使用Eclipse來(lái)開(kāi)發(fā)Android應用,ADT插件將給你帶來(lái)極大的幫助:
更多的關(guān)于A(yíng)DT插件的信息,包括安裝指令,請參見(jiàn)Installing the ADT Plugin for Eclipse。Hello Android描述了一個(gè)有用的例子程序和程序的效果圖。 Dalvik Debug Monitor Service(ddms)Dalvik調試監視服務(wù):它集成在Dalvik(Android平臺的虛擬機)中,用于管理運行在模擬器或設備上的進(jìn)程,并協(xié)助進(jìn)行調試。你可以用它來(lái)殺死進(jìn)程、選擇一個(gè)特定程序來(lái)調試、生成跟蹤數據、查看堆和線(xiàn)程數據、對模擬器或設備進(jìn)行屏幕快照等等。 Android Debug Bridge (adb)Android調試橋:它用于向模擬器或設備安裝應用程序的.apk文件和從命令行訪(fǎng)問(wèn)模擬器或設備。也可以用于將標準的調試器連接到運行在A(yíng)ndroid模擬器或設備上的應用代碼。 Android Asset Packaging Tool (aapt)Android資源打包工具:你可以通過(guò)aapt工具來(lái)創(chuàng )建.apk文件,這些文件包含了Android應用程序的二進(jìn)制文件和資源文件。 Android Interface Description Language (aidl)Android接口描述語(yǔ)言:它用來(lái)生成進(jìn)程間接口代碼。例如,在一個(gè)服務(wù)中可能就會(huì )用到。 sqlite3SQLite3數據庫:Android應用程序可以創(chuàng )建和使用SQLite數據文件,而開(kāi)發(fā)者和使用者也可以方便的訪(fǎng)問(wèn)這些SQLite數據文件。 Traceview跟蹤顯示工具:它可以生成跟蹤日志數據的圖形分析視圖。這些跟蹤日志數據由Android應用程序產(chǎn)生。 mksdcard創(chuàng )建SD卡工具:它幫助創(chuàng )建磁盤(pán)鏡像。這個(gè)磁盤(pán)鏡像可以在模擬器上模擬外部存儲卡(比如SD卡)。 dxDX工具:它將.class字節碼重寫(xiě)為Android字節碼(存儲在.dex文件中)。 activityCreatoractivityCreator:它是一個(gè)腳本,用來(lái)生成Ant構建文件。Ant構建文件用來(lái)編譯Android應用程序。如果你在安裝了ADT插件的Eclipse環(huán)境下開(kāi)發(fā),就不需要這個(gè)腳本了。
Android文檔閱讀04—Application的生命周期許可協(xié)議:creativecommons licenses
在多數情況下, 每個(gè)Android應用運行在自己的Linux進(jìn)程中. 當一個(gè)應用的某段code需要運行的時(shí)候這個(gè)進(jìn)程將會(huì )被創(chuàng )建, 直到不再需要該應用或系統要為其他的應用釋放內存的時(shí)候才停止.
一個(gè)非常重要且少有的特性是, 應用進(jìn)程的存活時(shí)間不是由這個(gè)應用直接控制的. 而是由系統決定的, 系統會(huì )根據每個(gè)已知的正在運行的應用情況來(lái)定奪, 包括, 該應用對用戶(hù)的重要性和系統全部可用內存.
對于開(kāi)發(fā)人員來(lái)講, 了解每個(gè)應用組件(尤其是, Activity, Service, 和IntentReceiver)對于應用進(jìn)程存活時(shí)間的影響是非常重要的. 如果沒(méi)有正確使用, 可能會(huì )導致應用進(jìn)程在處理重要工作的時(shí)候被系統殺掉.
在對應用進(jìn)程生命周期的理解中, 一個(gè)典型的錯誤就是當一個(gè)IntentReceiver 接收到Intent 之后, 會(huì )在自己的onReceiveIntent()方法中開(kāi)起一個(gè)線(xiàn)程, 而后return這個(gè)方法. 一旦這個(gè)方法return, 系統會(huì )認為這個(gè)IntentReceiver 不在處于活躍狀態(tài), 也就認為他的宿主進(jìn)程不再需要(除非還包有其他活躍的應用組件). 以至于當系統需要回收內存的時(shí)候會(huì )隨時(shí)釋kill掉這個(gè)進(jìn)程, 中止其中的子線(xiàn)程. 解決這個(gè)問(wèn)題的辦法是在IntentReceiver中啟動(dòng)一個(gè)Service, 這樣系統會(huì )知道在這個(gè)進(jìn)程中還有活躍的任務(wù)需要完成.
為了決定在內存較低的時(shí)候殺掉哪個(gè)進(jìn)程, Android會(huì )根據運行在這些進(jìn)程內的組件及他們的狀態(tài)把進(jìn)程劃分成一個(gè)"重要程度層次". 其重要的程度按以下規則排序:
當需要給一個(gè)進(jìn)程分類(lèi)的時(shí)候, 系統會(huì )在該進(jìn)程中處于活動(dòng)狀態(tài)的所有組件里掉選一個(gè)重要等級最高作為分類(lèi)依據. 查看Activity, Service,和IntentReceiver的文檔, 了解每個(gè)組件在進(jìn)程整個(gè)生命周期中的貢獻. 每一個(gè)classes的文檔詳細描述他們在各自應用的生命周期中所起得作用.
Android文檔閱讀05—Hello, Android!及調試許可協(xié)議:creativecommons licenses
第一印象,作為一個(gè)開(kāi)發(fā)人員,我們對一個(gè)新的開(kāi)發(fā)框架的第一印象通常是看他的”Hello,World!”程序有多簡(jiǎn)單。在A(yíng)ndroid中,實(shí)現起來(lái)是非常簡(jiǎn)單的。 實(shí)現Hello World需要幾個(gè)步驟:
以下幾節討論更加詳細的內容
Let‘s jump in! 廢話(huà)少說(shuō),馬上開(kāi)始。 創(chuàng )建項目創(chuàng )建項目非常簡(jiǎn)單,Eclipse的插件使Adroid的開(kāi)發(fā)變得異常輕松。首先你需要安裝一個(gè)3.3或以上版本的eclipse(譯注:其實(shí)3.2也是可以的),然后給Eclipse安裝一個(gè)Android插件。安裝好上面的內容后,我們就可以開(kāi)始了。 首先,我們來(lái)一個(gè)總結來(lái)看看到底需要幾步來(lái)完成我們的"Hello, World!"。 1. 通過(guò)Eclipse的 File > New > Project 菜單創(chuàng )建"Android Project"項目。 2. 在新Android 項目對話(huà)框中添加項目的詳細信息 3. 修改自動(dòng)生成代碼模板來(lái)顯示一些東西 上面3步已經(jīng)足夠了!接下來(lái),讓我們開(kāi)始吧
1. 創(chuàng )建Android項目 在Eclipse中選擇 File > New > Project 菜單項。如果你已經(jīng)成功安裝了Android 插件,你會(huì )在彈出的新項目對話(huà)框中看到一個(gè)叫做“Android”的條目,包含一個(gè)”Android Project”的項目
選中"Android Project",點(diǎn)擊 Next進(jìn)行入下一步。
2. 填寫(xiě)項目的相關(guān)信息 這個(gè)窗口里你需要填寫(xiě)一些項目的相關(guān)信息.請看圖中的示例:
下面解釋一下屏幕上的內容:
這是計算機中保存項目文件目錄的名稱(chēng)。 這是和Java語(yǔ)言意義相同的包名(Package namespace)—你的源代碼將屬于這個(gè)包名。同時(shí)stub Activity也將據此生成。 你所給出的報名必須保證在你的應用中是唯一的;因為這個(gè)原因,包的命名遵循域名方式(domain-style)就顯得非常重要了;在實(shí)例中我們使用"com.google.android"作為包名;你可以選擇一個(gè)適合你自己的包名。
Android插件將根據這個(gè)名稱(chēng)來(lái)創(chuàng )建一個(gè)stub類(lèi)。他是一個(gè)繼承自Activity類(lèi)的子類(lèi)。Activity類(lèi)似一個(gè)簡(jiǎn)單的可以運行和工作的類(lèi)。它能夠根據你的需要創(chuàng )建用戶(hù)界面,當然了這不是必須的。 這是你應用程序的標題。
你可以通過(guò)選擇"Use default location"這個(gè)復選框來(lái)項目文件的存儲位置。
3.編輯自動(dòng)生成的程序代碼
Android插件執行完畢后將創(chuàng )建一個(gè)叫做HelloAndroid類(lèi),他的內容如下:
public class HelloAndroid extends Activity { /**在activity被創(chuàng )建后執行*/
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
創(chuàng )建用戶(hù)界面創(chuàng )建好項目以后,我們要做的是在屏幕上顯示一點(diǎn)文字。下面是完成后的代碼,我們將逐行分析它:
public class HelloAndroid extends Activity {/**在activity被創(chuàng )建后執行*/
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
在A(yíng)ndroid中,用戶(hù)界面是由View來(lái)組成的。一個(gè)View就是一個(gè)drawable的對象,比如一個(gè)單選按鈕,一個(gè)動(dòng)畫(huà),或者(本例中)是一個(gè)文字標簽。View子類(lèi)型中用來(lái)顯示文字 類(lèi)是TextView。 下面演示如何構建一個(gè)TextView的實(shí)例
TextView tv = new TextView(this); TextView構造函數中的參數類(lèi)型是Context。Context類(lèi)可以簡(jiǎn)單的理解為系統的句柄;他提供訪(fǎng)問(wèn)了諸如資源、數據庫以及程序設置的服務(wù)。Activity類(lèi)繼承自Context。我們的HelloAndroid類(lèi)繼承自Activity類(lèi),他同時(shí)也繼承了Context。正因為如此我們才能使用’this’這個(gè)參數來(lái)創(chuàng )建TextView。
上面我們已經(jīng)創(chuàng )建了一個(gè)TextView,下面我們來(lái)讓他顯示些文字:
tv.setText("Hello, Android");
這里沒(méi)有什么好說(shuō)的。 我們已經(jīng)創(chuàng )建了一個(gè)TextView并且告訴了他要顯示什么,最后就是讓他顯示在屏幕上了,就像下面這樣:
setContentView(tv); setContentView()方法讓系統知道哪個(gè)View是與Activity的界面有聯(lián)系的。如果你的Activity沒(méi)有執行這個(gè)方法,界面將什么都不會(huì )顯示,系統只會(huì )顯示空屏幕。我們的目的是要顯示一些文字,所以我們在這個(gè)方法的參數中填上TextView。
這就是我們Android中的"Hello, World"了!接下來(lái)當然是看看如何運行它了。 運行程序:Hello, AndroidAndroid提供的Eclipse插件使得運行我們的程序非常簡(jiǎn)單。選擇Run > Open Run Dialog菜單;你會(huì )看到一個(gè)這樣的對話(huà)框:
接下來(lái),選中"Android Application"這一項。點(diǎn)擊左上角按鈕(文檔圖標上有個(gè)加號的那個(gè))或者簡(jiǎn)單雙擊"Android Application"項。你會(huì )得到一個(gè)叫做"New_configuration" 新launcher。
選擇一個(gè)更好的名字,比如"Hello, Android", 點(diǎn)擊"Browse"按鈕選擇你的項目。(如果你現在打開(kāi)了多個(gè)Android的項目,一定要確認你選擇了正確的那個(gè))。Android插件會(huì )自動(dòng)的掃描你的項目來(lái)查找Activity 的子類(lèi),在"Activity:" 標簽下面的下拉框中列出所有的選項。你的"Hello, Android" 只有一個(gè),他將作為缺省的選項。 點(diǎn)擊 "Apply" 按鈕。示例如下:
大功告成!點(diǎn)擊run按鈕,Androi模擬器將運行。當模擬器啟動(dòng)完成你將看到你的程序。到這里我們就完成了。
這就是我們Android中 “Hello,World”。很簡(jiǎn)單吧,嗯?下面的章節我們會(huì )探討一些比較深入的東西,對你學(xué)習Android肯定有所幫助。 通過(guò)XML Layout構造用戶(hù)界面你剛剛完成"Hello, World"時(shí)通過(guò)編程來(lái)創(chuàng )建用戶(hù)界面的。也就是說(shuō)你在你的程序代碼中來(lái)創(chuàng )建界面。如果你以前做過(guò)很多的界面編程,你一定知道有個(gè)非常麻煩的事情:在一大段代碼中找到并且修改一個(gè)小的界面變化是很頭疼的。而且也容易忘記屬性與視圖之間的關(guān)系,從而導致錯誤,浪費大量的時(shí)間來(lái)調試代碼。
這就是Android提供了一個(gè)替代創(chuàng )建用戶(hù)界面的模式:基于XML的XML Layout文件。解釋這個(gè)概念的最好方法就是創(chuàng )建一個(gè)例子。這個(gè)XML Layout文件實(shí)現了我們上面用程序代碼實(shí)現的功能。
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Hello, Android"
/>
一般的Android XML Layout 文件 結構非常簡(jiǎn)單。它由樹(shù)形的標記組成,每一個(gè)標記都是一個(gè)View類(lèi)。在上面這個(gè)例子中只有一個(gè)元(element)-TextView。你可以在XML layout中使用任何一個(gè)繼承自View的類(lèi),也包括你自己定義的類(lèi)。這樣簡(jiǎn)單的結構和語(yǔ)法使我們能夠比使用代碼更快的創(chuàng )建用戶(hù)界面。它的靈感來(lái)自Web開(kāi)發(fā)中用戶(hù)界面與程序邏輯分開(kāi)的模式。
這個(gè)例子中只有4個(gè)XML屬性,下面列出含義: android:layout_width 這個(gè)屬性定義了使用寬度,磁力中使用最大可用寬度。 android:layout_height 同上,使用可用的屏幕高度 android:text TextView顯示的文字內容,這個(gè)例子中顯示 "Hello, Android
這就是XML layout的內容,但是該將它放在那里呢?在項目的res/ 目錄中。這個(gè)"res"是對"resources"的縮寫(xiě),這個(gè)目錄中存放項目中所有不是代碼的資源或文件。包括:圖片,本地字符串,XML layout文件。
Eclipse插件已經(jīng)為我們創(chuàng )建了這些XML文件。在我們上面的例子中,我們根本沒(méi)有使用過(guò)他們。在Package Explorer中展開(kāi)res/layout,目錄,修改其中的main.xml文件。使用上面的文本替換掉他的內容?,F在從Package Explorer中的源代碼文件夾中打開(kāi)R.java文件,你將看到如下內容:
public final class R {
public static final class attr {
};
public static final class drawable {
public static final int icon=0x7f020000;
};
public static final class layout {
public static final int main=0x7f030000;
};
public static final class string {
public static final int app_name=0x7f040000;
};
}
項目中的R.java文件是對文件中所有定義資源的索引??梢杂米詈?jiǎn)單的方式在代碼中使用項目中定義的資源。利用Eclipse的代碼提示功能可以更快找到需要的內容。
其中最重要的兩個(gè)內部類(lèi)就是"layou"和"main"。Eclipse插件會(huì )根據你在XML layout文件中更改自動(dòng)生成R.java文件。當時(shí)你在項目中添加了其他資源后你會(huì )先R.java會(huì )馬上發(fā)生變化。
最后一件事就是你要修改你的HelloAndroid 代碼,讓程序使用XML layout文件定義的界面而不是采用我們以前的硬編碼方式??纯船F在的代碼,簡(jiǎn)單多了:
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
不要簡(jiǎn)單的拷貝粘貼來(lái)修改文件,試試R類(lèi)的代碼自動(dòng)完成,這是你或許感覺(jué)到R類(lèi)的作用了。
好,現在你已經(jīng)完成了修改,讓我們重新運行一下程序---你要做的就是點(diǎn)擊以下有綠色箭頭圖標的Run按鈕,或者選擇Run>Run菜單來(lái)運行。你會(huì )看到和以前相同的結果。我們可以看出兩種不同的布局方法結果是相同的。
我們只是對XML layouts有了個(gè)大概的了解,你需要閱讀用戶(hù)界面部分的完整文檔來(lái)獲取進(jìn)一步的信息。 調試程序Android的Eclipse的插件也能夠完美的與Eclipse的調試器集成。為了證實(shí)這一點(diǎn),我們來(lái)做一個(gè)簡(jiǎn)單的測試。將你HelloAndroid 程序的代碼改成這樣: 這段代碼很明顯將產(chǎn)生一個(gè)NullPointerException 異常。運行后你看到:
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Object o = null;
o.toString();
setContentView(R.layout.main);
}
}
為了找出錯誤,我們在"Object o = null;"這一行設置一個(gè)斷點(diǎn)(你可以通過(guò)雙擊eclipse編輯器行號左邊的空余部分來(lái)創(chuàng )建)。選擇 Run > Debug菜單進(jìn)入到調試模式。你的程序在模擬器中重新啟動(dòng),但是這次程序會(huì )在運行到斷點(diǎn)的地方停住。就行你在其他開(kāi)發(fā)工具中那樣,你可以在Eclipse的Debug Perspective中檢查代碼。 不使用eclipse創(chuàng )建項目如果你不使用Eclipse(比如其他IDE或者是使用簡(jiǎn)單的文本編輯器和命令行工具),那么Android的Eclipse插件就幫不了你了。但是別太擔心--你不會(huì )因為不使用Eclipse而失去某些功能。
Android 插件實(shí)際上只是對SDK里面的工具做了一下封裝。因此可以使用其他工具來(lái)封裝這些工具,比如‘ant‘來(lái)編譯文件。(像emulator, aapt, adb, ddms這些工具都可以在文檔中找到使用的方法)
Android SDK 同時(shí)包含了一個(gè)名稱(chēng)為"activityCreator.py"的Python的程序腳本,用來(lái)創(chuàng )建項目中的代碼和目錄,以及一個(gè)兼容‘ant‘的build.xml文件。這使得你可以通過(guò)命令行或者使之與其他的IDE工具集成。
例如,創(chuàng )建一個(gè)想剛才我們在eclipse中創(chuàng )建的HelloAndroid 項目,你可以使用這樣的命令: activityCreator.py --out HelloAndroid com.google.android.hello.HelloAndroid 為了編譯這個(gè)項目,你必須使用ant命令。當命令成功完成后,你可以在‘bin‘目錄中找到一個(gè)HelloAndroid.apk文件。這個(gè).apt文件就是一個(gè)Android 包,你可以使用‘adb‘工具把它安裝到模擬器中。 Android 文檔的閱讀順序因為看了看Android Blog, 在最新的文章里面介紹了幾篇文章,其中一篇是<<以開(kāi)發(fā)者的眼光來(lái)看Android SDK>>,作者在其中分析了的關(guān)于DOC的閱讀順序引起了我的興趣,確實(shí),那么多的文檔,應該怎么看呢?哪些是必須先弄明白的?哪些應該先知道個(gè)大概,今后引用的時(shí)候再細細閱讀?現在簡(jiǎn)要的介紹一下原作者的觀(guān)點(diǎn),希望能幫上你的忙。
1. 首先當然是要知道,什么是Android? 2. 讀一下Anatomy of an Android Application 能夠知道一個(gè)Android application 中到底都有些什么東西 3. 接著(zhù)可以讀一下 Development Tools 文檔 4. 然后可以看一下關(guān)于什么周期的文章 Lifecycle of an Android Application 5. 現在可以動(dòng)手了,玩玩hello world 吧,Hello Android 6. 回去讀一下 Installing the SDK文檔,再這篇文章的后半部分講了很多關(guān)于Debug的功能和技巧 7. 開(kāi)始Notepad Application 的制作和學(xué)習吧,如果你真正弄懂了關(guān)于這個(gè)應用程序的4個(gè)練習,你已經(jīng)從菜鳥(niǎo)開(kāi)始轉向高手嘍。 8. Developing Android Applications 花了很多時(shí)間來(lái)介紹更多的細節,包括如何實(shí)現UI,數據存儲和讀取,安全問(wèn)題等 9. 最后,你現在可以自由的漫步在links中了,找你感興趣的讀讀吧。 |
聯(lián)系客服