Android應用的基本原理

原文:http://android.eoe.cn/topic/android_sdkjava

應用基礎-Application Fundamentals

Android應用程序以java做爲開發語言。用Android SDK 提供的工具,能夠將應用程序所須要的數據和資源文件打包到一個android包文件中,這個文件用.apk做爲擴展名。全部代碼都在單個.apk文件中,當成一個應用,這個文件就是一般安裝在Android設備中的應用.
一旦安裝到了一個設備,每一個應用生存在它本身的安全沙箱中。linux

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

經過這種方法,Android系統實現了最小特權原則。默認,每一個應用僅僅訪問須要工做的組件,並很少作其餘的事。這樣建立了一個很是安全的環境,應用不能訪問系統沒有受權的其餘部分.android

然而,應用能夠有多種方法來與其餘應用,共享數據及訪問系統服務:數據庫

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

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

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

應用組件-Application Components


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

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

下面是四種應用組件:框架

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樣例應用程序,就使用內容提供者來保存筆記的.
    • 一個內容提供者被看成ContentProvider的子類實現,而且必須實現一套標準的APIs,以讓其餘的應用能執行交換操做。
    • 參考Content Providers開發指南,以瞭解更多信息.

Broadcast receivers廣播接收者

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

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

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

激活組件-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的詳細信息,請看Intents 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
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文檔

聲明組件功能-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.你能夠加一個組件聲明的元素的子元素,爲你組件聲明一個意圖過濾器。

好比,一個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文件中用 元素聲明,以明確指出你的應用支持的屏幕尺寸.

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

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

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

    • 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版以後,加入到平臺的,你應該用元素,聲明最小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開發指南

相關文章
相關標籤/搜索