應用基礎-Application Fundamentals

應用基礎-Application Fundamentals

Android應用程序以java作爲開發語言。用Android SDK 提供的工具,可以將應用程序所需要的數據和資源文件打包到一個android包文件中,這個文件用.apk作爲擴展名。所有代碼都在單個.apk文件中,當成一個應用,這個文件就是通常安裝在Android設備中的應用. 一旦安裝到了一個設備,每個應用生存在它自己的安全沙箱中。

    • 一個Android系統是一個多用戶的Linux系統,其中的每個應用都是一個不同的用戶。
    • 默認情況下,系統給每個應用分配一個獨立的Linux用戶ID(這個ID只由系統使用並且對應用來說是不可知的),系統給在某個應用中的所有文件設置了權限,所以只有分配了那個用戶ID的應用才能訪問它們
    • 每個進程擁有它自己的虛擬機,所以一個應用代碼的運行,與其他應用代碼的運行是隔離的.
    • 默認情況下,每個應用程序均運行於它自己的Linux進程中。當應用程序中的任意代碼開始執行時,Android啓動一個進程,而當不再需要此進程而其它應用程序又需要系統資源時,則關閉這個進程。

通過這種方法,Android系統實現了最小特權原則。默認,每個應用僅僅訪問需要工作的組件,並不多做其他的事。這樣創建了一個非常安全的環境,應用不能訪問系統沒有授權的其他部分.

然而,應用可以有多種方法來與其他應用,共享數據及訪問系統服務:

    • 有可能安排兩個應用共用一個linux系統ID,在那種情況下,它們能互相訪問相互的數據。爲了節約系統資源,擁用相同用戶ID的應用,可能也被安排運行在同一個Linux進程中並共享相同的VM(應用必須被簽名成同樣的認證)。
    • 所用應用能請求允許訪問硬件數據,比如像用戶通信錄,SMS消息及可掛載的存儲設備(SD card),攝像頭,藍牙等,所有應用的權限必須在用戶安裝時被許可。

上述了一個應用怎樣存在於一個系統中的相關基本概念,這個文檔的其他部分將向你介紹如下 內容:

    • 定義在你的應用中核心框架組件
    • 在manifest中,給你的應用,聲明組件及設備特點請求
    • 獨立於應用代碼的資源,可以讓你的應用極大的優化它在各種配置設備的表現

應用組件-Application Components


應用組件是構建Android應用程序的關鍵和基石。 每個組件是一個不同的入點,系統可以從這些點進入到你的應用。對於用戶來說,並不是每個組件都是實際的入點,但它們之間有一些依賴.但是每一個存在的組件都有它自己的一個入點,並扮演一個特定的角色--每一個都是獨一無二的構建塊,幫助你定義你的應用的整體行爲.

有四個不同類型的應用組件,每個類型服務於一個不同的目的,並有不同的生命週期,生命週期定義瞭如何創建和銷燬它.

下面是四種應用組件:

Activities活動

    • 一個activity在一個屏幕,顯示一個用戶接口.比如,一個email應用可能有一個activity,這個activity用於顯示新的email列表.而另一個activity用於寫郵件,還有一個activity用於讀取郵件.雖然這些activities一起工作於email應用中,形成一個完整的用戶體驗但每一個部分又是相互獨立的.正因如此,不同的應才能啓動這些活動的任意一個(如個email應用允許它).比如,一個照相的應用,能開啓一個email應用中寫封新郵件的活動,讓用戶分享一張照片.
    • 一個activity被當作Activity的子類來實現的,在Activities開發指南中,你可以學到更多關於它的使用

Services服務

    • 一個service是長期運行在後臺,執行操作的組件,甚至可以爲遠程進程工作.一個服務不提供用戶界面.比如,當用戶在其他應用中時,一個服務可能在後臺播放音樂,或者在後臺獲取數據,這並不影響用戶跟其他的活動進行交互操作.其他的組件,比如一個activity,可以啓動一個服務,並可以讓它運行或者邦定到這個activity,以便與其進行交互操作.
    • 一個服務是作爲Service子類來實現的,在Services開發指南中,你能學到更多關於它的使用

Content providers 內容提供

    • 一個content provider管理共享的應用數據集.你可以把數據存在文件系統中,一個SQLite數據庫中,網上,或你應用可以訪問的永久存儲器中.通過內容提供者,其他的應用可以查詢甚至修改數據(如果內容提供者允許的話). 比如,Android系統提供一個內容提供者管理用戶通信錄信息.因此,任何擁用適當權限的應用,可以查詢內容提供者的部分來(比如ContactsContract.Data)讀取和寫入關於某個人的信息.內容提供者對於讀取和寫入屬於你的應用的私有的非共享數據也是非常有用的,比如Note Pad樣例應用程序,就使用內容提供者來保存筆記的.
    • 一個內容提供者被當作的子類實現,並且必須實現一套標準的APIs,以讓其他的應用能執行交換操作。
    • 參考Content Providers開發指南,以瞭解更多信息.

Broadcast receivers廣播接收者

    • 廣播接收者是一個響應系統範圍廣播公告(通知)的組件.許多廣播信息,都是來源於系統,比如,通知屏幕關閉的公告,電量低,或抓取了一張圖片.應用也能發起廣播,比如,讓其他的應用知道一些數據已下載到設備了,並且他們可以使用了。雖然廣播接收者,不能顯示用戶界面,但當一個廣播事件發生時,它們可以創建一個狀態通知器,去提醒用戶.但更多情況下,一個廣播接收者只是一個其他組件,想要做極小量事件的一個"gateway”(途徑).舉例,它可能發起一個服務,去執行關於某個事件的一些工作.
    • 一個廣播接收者,是當作BroadcastReceiver子類被實現的.每個廣播接收者都是從Intent對象衍生出來的。更多信息,請參考BroadcastReceiver類

任何一個應用能啓動另一個其他應用的組件,是Android系統設計獨一無二的方面(aspect).比如,你想要用設備的照相機拍一張圖片.其他的應用已經有了這個功能,並且你的應用可以使用它,而不需要你自己去開發一個拍照相的activity.你並不需要合併(包含)或者甚至是鏈接camera應中的代碼; 而只是,簡單的啓動camera應用中的活動,來拍照就可以了.當拍照完成,甚至把照片返回給你的應用,所以你能使用它。對於用戶來講,camera像是你應用中一部分.當系統開啓一個組件時,它會啓動那個應用的進程(如果該應用沒有運行),並實例化該組件所需要的類.舉例,如果你的應用開啓一個camera應用的activity,來拍照,這個activity將運行在屬於camera應用的進程中,而不是在你的應用的進程中.因此,不像大多數其他的系統的應用,Android應用,沒有單個的入點(比如沒有main()函數).

因爲系統運行的每個應用,在一個帶有文件權限的,獨立的進程中,這樣限制了對其他應用的訪問,你的應用不能直接訪問其他應用中的組件.但時,Android系統也能激活其他應用的組件.你必須傳一個消息給系統,指定你想要啓動的組件,然後系統爲你激活這個組件.

激活組件-Activating Components


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對象方法.(這一句不好理解。)爲了安全起見,組件請求信息與內容提供者之間有一個抽象層.

下面是激活各種類型組件的幾個方法:

    • 你可以通過傳一個(或者一些要做新的事情)Intent參數給startActivity()或startActivityForResult()(當你想要activity返回一個參數)函數(),來啓動一個activity.
    • 你可以傳一個Intent給startService()方法,(或給一個新的指令給正在運行的服啓),或者你可以傳一個Intent給bindService()方法來邦定到服務.
    • 你可以通過使用sendBroadcast(), sendOrderedBroadcast(), 或者 sendStickyBroadcast()三種方法來廣播一個intent。
    • 你可以對ContentResolver調用query()方法,對內容提供者進行查詢

關於使用intents的詳細信息,請看ntents and Intent Filters 文檔。在後面的文檔中,也有一些關於激活某個組件的信息Activities, Services, BroadcastReceiver and Content Providers.

清單文件-The Manifest File


在Android系統開啓一個應用組件之前,系統必須通過讀取AndroidManifest.xml文件來知道組件的存在.你的應用必須把它所有的組件聲明在這個文件中,並且必須在應用工程的根目錄下.

這個manifest文件除了聲明組件外,還處理了許多其他的事情,比如:

    • 指定應用請求的其他權限,訪問網絡或訪問用戶的通信錄
    • 聲明應用要求的最小API Level,應用使用的是那個API
    • 聲明應用請求和使用的軟硬件特徵,比如照相機,藍牙服務,或多點觸模屏
    • 應用需要鏈接的API庫,比如Google Maps library
    • 等等

聲明組件-Declaring components


manifest文件的主要任務是告訴系統,應用的組件,比如,一個manifest可以這樣聲明一個activity:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest ... >
  3. <application android:icon="@drawable/app_icon.png" ... >
  4. <activity android:name="com.example.project.ExampleActivity"
  5. android:label="@string/example_label" ... >
  6. </activity>
  7. ...
  8. </application>
  9. </manifest>
    複製代碼

在<application> 元素中,android:icon指定應用的icon資源 在<activity> 元素中的,android:name 屬性,指定Activity子類的完全類名,android:label 屬性,爲activity指定一個用戶可以見的標籤。 你必須這樣聲明 所有應用的組件:

  • <activity> 聲明活動的元素
  • <service> 聲明服務的元素
  • <receiver> 聲明廣播接收者元素
  • <provider> 聲明內容提供者元素

在你代碼中包含的,Activites,services和內容提供者,若沒有在manifest中聲明,對系統來說是不可見的,即將永遠不會運行。但是,廣播接收者即可以在manifest中聲明,也可以在代碼中動態創建(做爲BroadcastReceiver對象)並且通過registerReceiver()方法向系統註冊。

瞭解manifest文件的詳細構建過程,請看The AndroidManifest.xml File文檔

聲明組件功能-Declaring component capabilities


就如在上面的Activating Components中所討論的,你可以用一個Activating Components啓動activities,services和broadcast 接收者.你也可以在intent中顯式的指定目標組件(使用組件類名)。然而,intent真正強大的是它的intent action.(動作)。通過使用intent動作,你只須簡單的描述你要執行的action類型,(並且,可選的與執行動作有關的數據),並且允許系統在設備上找到一個組件,這樣就可以執行那個動作並啓動它。如果有多個組件可以執行,intent指定的action,那麼用戶選擇執行那一個.

通過比較設備上的其他應用的manifest文件上的intent filters與接收到的intent.系統確定那個組件可以響應一個intent. 當你在你的應用的manifest中聲明一個組件時,你可以可選擇包括intent filters(意圖過濾器),來指定組件的功能,以讓其能響應其他應用的intents.你可以加一個組件聲明的元素的子元素<intent-filter>,爲你組件聲明一個意圖過濾器。

比如,一個email應用中,新建email的一個activity可能在它的manifest 中聲明瞭一個意圖過濾器,以便能響應”send”意圖(爲了發送郵件)。然後,在你的應用中的一個activity,創建了一個帶有”send” ACTION_SEND的意圖,.當你調用startActivity()方法,啓動該意圖過濾器時,系統將其匹配到email應用的“send”活動,並運行它。

關於創建意圖過濾器的詳細信息,參考Intents and Intent Filters 文檔

聲明應用需求-Declaring application requirements


有許多設備裝了Android,但它們並不提供所有相同的特點和功能.爲了避免你的應用,裝在一個沒有你應用所必特徵的設備上.通過在你的manifest文件中聲明軟件硬件要求,明瞭的指出你的應用支持的硬件類型是非常重要的大多數聲明僅僅只是信息,系統並不讀取他們,但像Android市場這樣的其他服務,將讀取它們,以便讓用戶在爲他們的設備尋找應用時,可以進行篩選.

比如,如果你的應用需要有照相機,並且使用的API是2.1(API Level 7),你應在你的manifest文件中聲明這些要求.這樣,那些沒有照相機並且Android版本低於2.1的設備,就不能從Android市場上安裝你的應用.

但,你也可以聲明你的應用使用camera,但不必須要求。那種情況,你的應用必在運行時一個檢查,以確定設備是否有一個照相機,如果沒有照相機,並禁止與照相相關的功能。

下面是一些重要的設備特性,你在設計和開發應用時必須要考慮的..

    • creen size and density 屏幕尺寸與解釋度
  • 爲了能從它們的屏幕尺寸來分類設備,Android爲每個設備定義了兩個特性:屏幕尺寸(屏幕的物理尺寸)和解釋度(在屏上的像素的物理密度,或者dpi--每英寸的點數).爲了簡化屏幕配置的所有不同類型,Android系統把它們分成可選的組,以便更容易定位

  • 屏幕大小:小,正常,大和極大

  • 屏幕解釋度:低解釋度,中解釋度,高解釋度,和極高解釋度

  • 默認情況下,你的應用是兼容所有屏幕尺寸和解釋度的,因爲Android系統對此做了適當的調整,以使得它適合你的UI佈局和圖像資源

  • 然而,你應爲某個屏幕尺寸創建特殊的佈局,併爲某些解釋度提供特定的圖像,使用可選的資源,並在你的manifest文件中用<supports-screens> 元素聲明,以明確指出你的應用支持的屏幕尺寸.

  • 更多信息,參考Supporting Multiple Screens文檔

    • Input configurations 輸入配置
  • 許多設備爲用提供了一個不同類型輸入裝置,比如,硬件鍵盤,軌跡球,five-way導航pad.如果你的應用必須要一個特別的輸入硬件,那麼你應在你的應用中使用<uses-configuration>元素聲明.但時,應用必須要一個特別的輸入配置的情況是極少的.

    • Device features 設備特性
  • 在一個裝有Android的設備中,有許多軟硬件特性,有可能有,或有可能沒有。比如照相機,光敏器件,藍牙,或某個版本的OpenGL,或者觸模屏的精度.你應該從不假設,在所有的裝有Android的設備中某個特點是可用的(除了標準的Android庫),所以你應該用 <uses-feature>元素聲明你的應用支持的特徵.

    • Platform Version 平臺版本
  • 不同的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版之後,加入到平臺的,你應該用<uses-sdk>元素,聲明最小API級別,這樣就指出了那些API將被採用.

爲你的應用聲明所有必要性的要求非常重要.因爲,當你把你的應用發佈到Android市場.市場,將用這些聲明信息來過濾出,那些應用在每個設備是可用的. 同樣,你的應用應該只能在滿足所有你應用需求的設備上纔可用.

更多關於Android市場如何基於這些需求過濾的,請看Market Filters文檔

應用資源-Application Resources


一個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開發指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章