原文:http://android.eoe.cn/topic/android_sdkjava
Android應用程序以java做爲開發語言。用Android SDK 提供的工具,能夠將應用程序所須要的數據和資源文件打包到一個android包文件中,這個文件用.apk做爲擴展名。全部代碼都在單個.apk文件中,當成一個應用,這個文件就是一般安裝在Android設備中的應用.
一旦安裝到了一個設備,每一個應用生存在它本身的安全沙箱中。linux
經過這種方法,Android系統實現了最小特權原則。默認,每一個應用僅僅訪問須要工做的組件,並很少作其餘的事。這樣建立了一個很是安全的環境,應用不能訪問系統沒有受權的其餘部分.android
然而,應用能夠有多種方法來與其餘應用,共享數據及訪問系統服務:數據庫
上述了一個應用怎樣存在於一個系統中的相關基本概念,這個文檔的其餘部分將向你介紹以下 內容:安全
應用組件是構建Android應用程序的關鍵和基石。 每一個組件是一個不一樣的入點,系統能夠從這些點進入到你的應用。對於用戶來講,並非每一個組件都是實際的入點,但它們之間有一些依賴.可是每個存在的組件都有它本身的一個入點,並扮演一個特定的角色--每個都是獨一無二的構建塊,幫助你定義你的應用的總體行爲.網絡
有四個不一樣類型的應用組件,每一個類型服務於一個不一樣的目的,並有不一樣的生命週期,生命週期定義瞭如何建立和銷燬它.app
下面是四種應用組件:框架
任何一個應用能啓動另外一個其餘應用的組件,是Android系統設計獨一無二的方面(aspect).好比,你想要用設備的照相機拍一張圖片.其餘的應用已經有了這個功能,而且你的應用可使用它,而不須要你本身去開發一個拍照相的activity.你並不須要合併(包含)或者甚至是連接camera應中的代碼; 而只是,簡單的啓動camera應用中的活動,來拍照就能夠了.當拍照完成,甚至把照片返回給你的應用,因此你能使用它。對於用戶來說,camera像是你應用中一部分.當系統開啓一個組件時,它會啓動那個應用的進程(若是該應用沒有運行),並實例化該組件所須要的類.舉例,若是你的應用開啓一個camera應用的activity,來拍照,這個activity將運行在屬於camera應用的進程中,而不是在你的應用的進程中.所以,不像大多數其餘的系統的應用,Android應用,沒有單個的入點(好比沒有main()函數).異步
由於系統運行的每一個應用,在一個帶有文件權限的,獨立的進程中,這樣限制了對其餘應用的訪問,你的應用不能直接訪問其餘應用中的組件.但時,Android系統也能激活其餘應用的組件.你必須傳一個消息給系統,指定你想要啓動的組件,而後系統爲你激活這個組件.ide
4個組件中的其中三個組件---activities,serivces,和broadcast receivers----是被叫作intent的異步消息激活的.在運行時,Intents把某個的組件與其餘的組件互相邦定,而無論這個組件是否屬於你的應用仍是其餘的應用(你能夠把它們想像成一個消息,用於請求一個其餘組件的動做).
一個intent是一個由Intent建立的對象.該對象定義了一個激活某個特定組件或者某個組件類型的消息,一個intent能夠是顯示的,一樣,也能夠是隱式的.
對於activities和services,一個intent(意圖)定義了一個要執行的動做(好比:to」view」或"send" 些什麼),並指定了要採用的URI格式的數據(其中一些,是其餘組件啓動所須要知道的).好比,一個intent可能傳送一個請求給一個activity,要顯示一張圖片或打開一個網頁.在有些狀況,你啓動一個activity接收一個結果,這種狀況下,activity將在Intent中返回一個結果.(好比,你能夠指示一個intent,讓用戶取一我的的聯繫方式,並返回給你,返回的intent中會包含一個指向選定聯繫方式的URI.)
對於廣播接收者,intent只是定義了一個作爲廣播的公告.(好比,一個廣播指出,設備電池低,它只是包含了一個動做字串,表示」電池低」).
其餘組件,內容提供者,不會被intents所激活.進一步講,它是內容解釋者(ContentResolver)所請求的目標所激活的.內容解釋者,處理全部與內容提供者的直接交換.因此組件不須要執行與提供者交換,而是調用ContentResolver對象方法.(這一句很差理解。)爲了安全起見,組件請求信息與內容提供者之間有一個抽象層.
下面是激活各類類型組件的幾個方法:
關於使用intents的詳細信息,請看Intents and Intent Filters 文檔。在後面的文檔中,也有一些關於激活某個組件的信息Activities, Services, BroadcastReceiver and Content Providers.
在Android系統開啓一個應用組件以前,系統必須經過讀取AndroidManifest.xml文件來知道組件的存在.你的應用必須把它全部的組件聲明在這個文件中,而且必須在應用工程的根目錄下.
這個manifest文件除了聲明組件外,還處理了許多其餘的事情,好比:
manifest文件的主要任務是告訴系統,應用的組件,好比,一個manifest能夠這樣聲明一個activity:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:icon="@drawable/app_icon.png" ... >
<activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>
|
在 元素中,android:icon指定應用的icon資源
在 元素中的,android:name 屬性,指定Activity子類的徹底類名,android:label 屬性,爲activity指定一個用戶能夠見的標籤。
你必須這樣聲明 全部應用的組件:
在你代碼中包含的,Activites,services和內容提供者,若沒有在manifest中聲明,對系統來講是不可見的,即將永遠不會運行。可是,廣播接收者便可以在manifest中聲明,也能夠在代碼中動態建立(作爲BroadcastReceiver對象)而且經過registerReceiver()方法向系統註冊。
瞭解manifest文件的詳細構建過程,請看The AndroidManifest.xml File文檔
就如在上面的Activating Components中所討論的,你能夠用一個Activating Components啓動activities,services和broadcast 接收者.你也能夠在intent中顯式的指定目標組件(使用組件類名)。然而,intent真正強大的是它的intent action.(動做)。經過使用intent動做,你只須簡單的描述你要執行的action類型,(而且,可選的與執行動做有關的數據),而且容許系統在設備上找到一個組件,這樣就能夠執行那個動做並啓動它。若是有多個組件能夠執行,intent指定的action,那麼用戶選擇執行那一個.
經過比較設備上的其餘應用的manifest文件上的intent filters與接收到的intent.系統肯定那個組件能夠響應一個intent.
當你在你的應用的manifest中聲明一個組件時,你能夠可選擇包括intent filters(意圖過濾器),來指定組件的功能,以讓其能響應其餘應用的intents.你能夠加一個組件聲明的元素的子元素,爲你組件聲明一個意圖過濾器。
好比,一個email應用中,新建email的一個activity可能在它的manifest 中聲明瞭一個意圖過濾器,以便能響應」send」意圖(爲了發送郵件)。而後,在你的應用中的一個activity,建立了一個帶有」send」 ACTION_SEND的意圖,.當你調用startActivity()方法,啓動該意圖過濾器時,系統將其匹配到email應用的「send」活動,並運行它。
關於建立意圖過濾器的詳細信息,參考Intents and Intent Filters 文檔
有許多設備裝了Android,但它們並不提供全部相同的特色和功能.爲了不你的應用,裝在一個沒有你應用所必特徵的設備上.經過在你的manifest文件中聲明軟件硬件要求,明瞭的指出你的應用支持的硬件類型是很是重要的大多數聲明僅僅只是信息,系統並不讀取他們,但像Android市場這樣的其餘服務,將讀取它們,以便讓用戶在爲他們的設備尋找應用時,能夠進行篩選.
好比,若是你的應用須要有照相機,而且使用的API是2.1(API Level 7),你應在你的manifest文件中聲明這些要求.這樣,那些沒有照相機而且Android版本低於2.1的設備,就不能從Android市場上安裝你的應用.
但,你也能夠聲明你的應用使用camera,但沒必要需要求。那種狀況,你的應用必在運行時一個檢查,以肯定設備是否有一個照相機,若是沒有照相機,並禁止與照相相關的功能。
下面是一些重要的設備特性,你在設計和開發應用時必需要考慮的..
爲了能從它們的屏幕尺寸來分類設備,Android爲每一個設備定義了兩個特性:屏幕尺寸(屏幕的物理尺寸)和解釋度(在屏上的像素的物理密度,或者dpi--每英寸的點數).爲了簡化屏幕配置的全部不一樣類型,Android系統把它們分紅可選的組,以便更容易定位
屏幕大小:小,正常,大和極大
屏幕解釋度:低解釋度,中解釋度,高解釋度,和極高解釋度
默認狀況下,你的應用是兼容全部屏幕尺寸和解釋度的,由於Android系統對此作了適當的調整,以使得它適合你的UI佈局和圖像資源
然而,你應爲某個屏幕尺寸建立特殊的佈局,併爲某些解釋度提供特定的圖像,使用可選的資源,並在你的manifest文件中用 元素聲明,以明確指出你的應用支持的屏幕尺寸.
更多信息,參考Supporting Multiple Screens文檔
許多設備爲用提供了一個不一樣類型輸入裝置,好比,硬件鍵盤,軌跡球,five-way導航pad.若是你的應用必需要一個特別的輸入硬件,那麼你應在你的應用中使用元素聲明.但時,應用必需要一個特別的輸入配置的狀況是極少的.
在一個裝有Android的設備中,有許多軟硬件特性,有可能有,或有可能沒有。好比照相機,光敏器件,藍牙,或某個版本的OpenGL,或者觸模屏的精度.你應該從不假設,在全部的裝有Android的設備中某個特色是可用的(除了標準的Android庫),因此你應該用 元素聲明你的應用支持的特徵.
不一樣的Android設備,常常運行不一樣的Android平臺版本,好比Android1.6或者2.3. 每個成功的版本一般包括在前一個版本中不可用的API。爲了指出,那些APIs集是可用的,每一個平臺版本指定了一個API Level(好比, Android 1.0 is API Level 1 and Android 2.3 is API Level 9).若是你使用的APIs是在1.0版以後,加入到平臺的,你應該用元素,聲明最小API級別,這樣就指出了那些API將被採用.
爲你的應用聲明全部必要性的要求很是重要.由於,當你把你的應用發佈到Android市場.市場,將用這些聲明信息來過濾出,那些應用在每一個設備是可用的. 一樣,你的應用應該只能在知足全部你應用需求的設備上纔可用.
更多關於Android市場如何基於這些需求過濾的,請看Market Filters文檔
一個Android應用的組成不只只是代碼----它還有與代碼獨立的資源,好比圖像,音頻文件,及與應用可顯圖像任何其餘相關的.好比,你應該定義動畫,菜單,風格,顏色,和用XML文件定義活動的佈局.使用應用資源,能讓你的應用在不修改任何代碼的狀況下容易的升級各類特性---而且經過提供一套可選取的資源--能優化你的應用在各類配置不一樣的設備中的表現(好比不一樣的語言和屏幕尺寸).
對於每一個包含在你的Android工程中的資源,SDK將其定義成一個惟一的整型ID,這樣你就能夠在你的代碼中或在XML文件中定義的其餘資源中引用它.若是你的應用包括一個圖片名字是logo.png(保存在res/drawable/目錄 ),SDK工具將生成一個資源ID命名成R.drawable.logo,你能夠用它來引用圖片,並插入你的用戶界面中
提供與你的代碼分開的資源的一個很重要的方面是,使得你能爲不一樣的配置的設備提供可選資源.好比,在XML中定義UI字串,你能夠把字串翻譯成各類不一樣的語言並保存在不一樣的文件中.而後,以基於語言限定詞,你能夠追加資源目錄名(好比res/values-fr/ 用語法語資源),和用戶語言設置,Android系會將相應的資源應用到你的UI中.
Android爲你的可選資源,支持許多不一樣的qualifiers (限定詞).限定詞是一個包括在你的目錄名中的一個簡短的字串,是爲了定義那些資源將用在,該配置的設備上.再如,因爲設備的屏幕的方向和尺寸不一樣,你一般須要爲你的活動定義不一樣的佈局.好比,若設備的屏幕是豎向(高),你可能要一個帶有重直button 的佈局,當屏幕是橫向的(寬),按鈕應是水平對齊的.要根據方向來改變佈局,你要定義兩個不一樣的佈局,並在佈局的目錄名中使用相應的限定詞(qualifier).而後,系統將自動根據當前的設備朝向來應用相應的佈局.
要詳細瞭解,你的應用中能包含的各類資源,及如何爲各類配置的設備建立可選資源,請看Application Resources開發指南