爲了後面的例子作準備,本篇及接下來幾篇將介紹Android應用程序的原理及術語,這些也是做爲一個Android的開發人員必需要了解,且深入理解的東西。本篇的主題以下:html
由於這些內容比較理論,且沒有用例子來講明,看上去會比較枯燥,我就把這幾篇寫得算比較短,方便你們吸取。android
Android應用程序是用Java編程語言寫的。編譯後的Java代碼——包括應用程序要求的任何數據和資源文件,經過aapt工具捆綁成一個Android包,歸檔文件以.apk爲後綴。這個文件是分發應用程序和安裝到移動設備的中介或工具,用戶下載這個文件到他們的設備上。一個.apk文件中的全部代碼被認爲是一個應用程序。數據庫
aapt:編程
aapt是Android Asset Packaging Tool的首字母縮寫,這個工具包含在SDK的tools/目錄下。查看、建立、更新與zip兼容的歸檔文件(zip、jar、apk)。它也能將資源文件編譯成二進制包。網絡
儘管你可能不會常常直接使用appt,可是構建腳本(build scripts)和IDE插件會使用這個工具打包apk文件,構成一個Android應用程序。app
如需更詳細的使用細節,打開一個終端,進入tools/目錄下,運行命令:異步
- Linux或Mac操做系統:./aapt
- Windows:aapt.exe
注意:tools/目錄是指android SDK目錄下的/platforms/android-X/tools/編程語言
在許多方面,每一個Android應用程序生活在它本身的世界:ide
有可能設置兩個應用程序共享一個用戶ID,這種狀況下,他們可以看到對方的文件。爲了節省系統資源,具備相同ID的應用程序也能夠安排在同一個Linux進程中,共享同一個VM。函數
Android的一個主要特色是,一個應用程序能夠利用其餘應用程序的元素(假設這些應用程序容許的話)。例如,若是你的應用程序須要顯示一個圖像的滾動列表,且其餘應用程序已經開發了一個合適的滾動條並能夠提供給別的應用程序用,你能夠調用這個滾動條來工做,而不用本身開發一個。你的應用程序不用併入其餘應用程序的代碼或連接到它。相反,當需求產生時它只是啓動其餘應用程序塊。
對於這個工做,當應用程序的任何部分被請求時,系統必須可以啓動一個應用程序的進程,並實例化該部分的Java對象。所以,不像其餘大多數系統的應用程序,Android應用程序沒有一個單一的入口點(例如,沒有main()函數)。相反,系統可以實例化和運行須要幾個必要的組件。有四種類型的組件:
然而,並非全部的應用程序都必須包含上面的四個部分,你的應用程序能夠由上面的一個或幾個來組建。當你決定使用以上哪些組件來構建Android應用程序時,你應該將它們列在AndroidManifest.xml文件中,在這個文件中你能夠聲明應用程序組件以及它們的特性和要求。關於AndroidManifest.xml在Android開發之旅:HelloWorld項目的目錄結構的1.六、AndroidManifest.xml簡單介紹了一下,你能夠參考一下,下篇也將介紹它。
一個活動表示一個可視化的用戶界面,關注一個用戶從事的事件。例如,一個活動可能表示一個用戶可選擇的菜單項列表,或者可能顯示照片連同它的標題。一個文本短信應用程序可能有一個活動,顯示聯繫人的名單發送信息;第二個活動,寫信息給選定的聯繫人;其餘活動,從新查看舊信息或更改設置。雖然他們一塊兒工做造成一個總體的用戶界面,可是每一個活動是獨立於其餘活動的。每個都是做爲Activity基類的一個子類的實現。
android.app.Activity類:由於幾乎全部的活動(activities)都是與用戶交互的,因此Activity類關注建立窗口,你能夠用方法
setContentView(View)
將本身的UI放到裏面。然而活動一般以全屏的方式展現給用戶,也能夠以浮動窗口或嵌入在另一個活動中。有兩個方法是幾乎全部的Activity子類都實現的:
onCreate(Bundle):初始化你的活動(Activity),好比完成一些圖形的繪製。最重要的是,在這個方法裏你一般將用佈局資源(layout resource)調用
setContentView(int)方法定義你的UI,和用
findViewById(int)在你的UI中
檢索你須要編程地交互的小部件(widgets)。setContentView
指定由哪一個文件指定佈局(main.xml),能夠將這個界面顯示出來,而後咱們進行相關操做,咱們的操做會被包裝成爲一個意圖(Intent),而後這個意圖對應有相關的activity進行處理。onPause()
:處理當離開你的活動時要作的事情。最重要的是,用戶作的全部改變應該在這裏提交(一般ContentProvider
保存數據)。
一個應用程序可能只包含一個活動,或者像剛纔提到的短信應用,它可能包含幾個活動。這些活動是什麼,以及有多少,固然這取決於它的應用和設計。通常來說,當應用程序被啓動時,被標記爲第一個的活動應該展現給用戶。從一個活動移動到另外一個活動由當前的活動完成開始下一個。
每個活動都有一個默認的窗口。通常來說,窗口會填滿整個屏幕,可是它可能比屏幕小或浮在其餘窗口上。一個活動還可使用額外的窗口——例如彈出式對話框,或當一用戶選擇屏幕上一個特定的項時一個窗口顯示給用戶重要的信息。
窗口的可視內容是由繼承自View基類的一個分層的視圖—對象提供。每一個視圖控件是窗口內的一個特定的矩形空間。父視圖包含和組織子女視圖的佈局。葉子視圖(在分層的底層)繪製的矩形直接控制和響應用戶的操做。所以,一個視圖是活動與用戶交互發生的地方。例如,一個視圖可能顯示一個小的圖片和當用戶點擊圖片時發起一個行爲。Android有一些現成的視圖你可使用,包括按鈕(buttons)、文本域(text fields)、滾動條(scroll bars)、菜單項(menu items)、複選框(check boxes)等等。
經過Activity.setContentView() 方法放置一個視圖層次在一個活動窗口中。內容視圖(content view)是層次結構的根視圖對象。層次結構以下圖所示:
Activity.setContentView() 方法:
public void setContentView (int layoutResID):根據佈局資源設置活動的界面。 資源將被誇大,添加布局資源文件中全部的最高層的視圖( top-level views )到活動.
一個服務沒有一個可視化用戶界面,而是在後臺無期限地運行。例如一個服務多是播放背景音樂而用戶作其餘一些事情,或者它可能從網絡獲取數據,或計算一些東西並提供結果給須要的活動(activities)。每一個服務都繼承自Service基類。
每一個服務類在AndroidManifest.xml中有相應的<service>聲明。服務能夠經過Context.startService()和Context.bindService()啓動。
一個典型的例子是一個媒體播放器播放一個播放列表中的歌曲。該播放器應用程序將可能有一個或多個活動(activities),容許用戶選擇歌曲和開始播放。然而,音樂播放自己不會被一個活動處理,由於用戶但願保持音樂繼續播放,當用戶離開播放器去作其餘事情時。爲了保持音樂繼續播放,媒體播放器活動能夠啓動一個服務運行在後臺。系統將保持音樂播放服務運行,甚至媒體播放器離開屏幕時。
能夠鏈接到(綁定到)一個持續運行的服務(並啓動服務,若是它還沒有運行)。鏈接以後,你能夠經過服務暴露的接口與服務交流。對於音樂服務,這個接口能夠容許用戶暫停、倒帶、中止和從新播放。
像活動(activities)和其餘組件同樣,服務(services)運行在應用程序進程中的主線程中。所以,他們將不會阻止其餘組件或用戶界面,他們每每產生其餘一些耗時的任務(如音樂播放)。
一個廣播接收者是這樣一個組件,它不作什麼事,僅是接受廣播公告並做出相應的反應。許多廣播源自於系統代碼,例如公告時區的改變、電池電量低、已採起圖片、用戶改變了語言偏好。應用程序也能夠發起廣播,例如爲了他其餘程序知道某些數據已經下載到設備且他們可使用這些數據。
一個應用程序能夠有任意數量的廣播接收者去反應任何它認爲重要的公告。全部的接受者繼承自BroadcastReceiver基類。
BroadcastReceiver類:
是接受sendBroadcast()發送的意圖(intents)的基類。能夠用Context.registerReceiver()動態地註冊這個類的實例,或者經過AndroidManifest.xml中<receiver>標籤靜態發佈。注意:若是你在Activity.onResume() 註冊一個接受者,你應該在Activity.onPause()註銷它。由於當暫停時你不會收到意圖,註銷它將削減沒必要要的系統開銷。不要在Activity.onSaveInstanceState()中註銷它,由於它將不會被調用,若是用戶移動到先前的堆棧。
有兩種主要的可接受廣播類型:
- 正常廣播(由Context.sendBroadcast發送)是徹底異步的。全部的廣播接收者以無序方式運行,每每在同一時間接收。這樣效率較高,可是意味着接受者不能使用結果或終止廣播數據傳播。
- 有序廣播(由Context.sendOrderedBroadcast發送)一次傳遞給一個接收者。因爲每一個接收者依次執行,所以它能夠傳播到下一個接收器,也能夠徹底終止傳播以便他不會傳遞給其餘接收者。接收者的運行順序可由匹配的意圖過濾器(intent-filter)的
android:priority
屬性控制。
廣播接收者不顯示一個用戶界面。然而,它們啓動一個活動去響應收到的信息,或者他們可能使用NotificationManager
去通知用戶。通知可使用多種方式得到用戶的注意——閃爍的背光、振動設備、播放聲音等等。典型的是放在一個持久的圖標在狀態欄,用戶能夠打開獲取信息。
內容提供者(content provider)使一個應用程序的指定數據集提供給其餘應用程序。這些數據能夠存儲在文件系統中、在一個SQLite數據庫、或以任何其餘合理的方式。內容提供者繼承自ContentProvider 基類並實現了一個標準的方法集,使得其餘應用程序能夠檢索和存儲數據。然而,應用程序並不直接調用這些方法。相反,替代的是它們使用一個ContentResolver對象並調用它的方法。ContentResolver能與任何內容提供者通訊,它與提供者合做來管理參與進來的進程間的通訊。
內容提供者是Android應用程序的主要組成部分之一,提供內容給應用程序。他們封裝數據且經過單個ContentResolver接口提供給應用程序。只有須要在多個應用程序間共享數據是才須要內容提供者。例如,通信錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。若是你不須要在多個應用程序間共享數據,你能夠直接使用SQLiteDataBase。
當ContentResolver發出一個請求時,系統檢查給定的URI的權限並傳遞請求給內容提供者註冊。內容提供者能理解URI想要的東西。UriMatcher 類用於幫組解析URIs。
須要實現的方法主要以下:
query(Uri, String[], String, String[], String)
返回數據給調用者insert(Uri, ContentValues)
插入數據到內容提供者update(Uri, ContentValues, String, String[])
更新內容提供者已存在的數據delete(Uri, String, String[])
從內容提供者中刪除數據getType(Uri)
返回內容提供者中的MIME 類型數據
更多的關於ContentResolver信息,請查看相關文檔。
每當有一個應該由特定組件處理的請求,Android能夠確保該組件的應用程序正在運行,若是沒有就啓動它,並且一個適當的組件實例可用,若是沒有就建立。
做者:吳秦出處:http://www.cnblogs.com/skynet/