天天看點

Android App基本要素(一)

安卓的應用程式架構(Android’s application framework)利用一組可重複使用的元件可以讓你建立極其豐富和新意的APPs。這部分解釋了Android Apps 如何工作以及你如何利用元件建立他們。

一、應用基本要素(Application Fundamentals)

Android 應用是用Java語言編寫。安卓軟體開發工具包(Android SDK tools)編譯代碼以及其他資料和資源檔案到一個安卓安裝包(Android Package)中,以.apk字尾的安裝(archive)檔案。一個.apk檔案中的所有代碼被認為是同一個應用同時.apk檔案也是應用在安裝裝置的安裝檔案。

一旦在裝置上安裝後,每個安卓應用都位于獨自的安全沙箱(security sandbox)中:

· Android作業系統是一個多使用者的Linux系統,每個應用是一個不同的使用者。

· 預設地,系統給每個應用配置設定一個唯一的Linux使用者ID(應用并不知道這個ID,隻有系統使用)。系統為應用中的所有檔案設定權限,這樣隻有配置設定給應用的使用者ID可以使用他們。

· 每個程序有各自的虛拟機(VM),是以一個應用的代碼和其他應用隔離運作。

· 預設地,每個應用運作在各自Linux程序。當任何一個應用的元件需要被執行時,Android 開始程序,然後當它不需要或者系統必須為其他應用恢複記憶體(recover memory)時關閉程序。

這樣,安卓系統實行最小權限原則(principle of least privilege POLP)。換言之,每個應用,預設地,隻能通路它工作需要的元件。這樣創造了一個非常安全的環境,在這裡應用不能通路沒有被授權的系統部分。

然後,這裡有多種方式讓一個應用和其他應用之間共享資料以及讓應用通路系統服務:

l  兩個應用共享同樣的Linux使用者ID,在這種情況下他們可以互相通路對方的檔案。為了維護系統資源,擁有相同使用者ID的應用運作在同樣的Linux程序中并共享相同的虛拟機VM(同樣應用必須簽署相同的證書)。

l  一個應用可以請求通路裝置資料的權限如使用者聯系人,短消息(SMS message),可安裝的儲存設備(SD Card),照相機,藍牙以及更多。所有應用的權限必須在安裝是獲得使用者同意。

這些包含有關系統中Android應用的基本要素。下面的文檔将給你介紹:

l  定義應用的核心架構元件。

l  為應用聲明元件并要求裝置特征的功能性清單檔案(manifest)。

l  和應用代碼分離的資源允許應用就多種配置的裝置優化它的行為。

二、應用元件

應用元件是Android App的基本構造子產品。每個元件是系統開始應用的不同點。對使用者來說并不是所有的元件都是實際的入口點,有些元件互相依賴,但是每個實際存在的元件都扮演一個特定的角色——每個元件是唯一的幫你規定應用的全部行為的構造子產品。

這裡有四種不同的應用元件。每種類型元件提供一個清楚的功能并有一個清楚的定義元件如何創立和銷毀的(Create and Destroy)生命周期。

這裡是四種應用元件的介紹:

活動(Activity)

    Activity表示一個帶有使用者界面(UI)的簡單螢幕。例如,一個Email App可能有一個顯示新郵件清單的activity,撰寫郵件的activity,以及閱讀郵件的activity。盡管這些Email App中的activity合作形成了一個完整的使用者體驗,但是每個activity都是互相獨立的。同樣如此,其他的應用也可以啟動這些activity(隻要Email App允許這樣)。例如,為了使用者共享照片,照相應用可以啟動Email App 中的Activity來撰寫新郵件。

activity利用Activity的子類實作,你可以在Activity開發指導中學習更多。

服務(Service)

Service是一個在背景運作的元件執行長期運作的操作(long-running operation)或者完成遠端程序。Service不提供UI。例如,當使用者處理其他應用時,service可以在背景播放音樂,或者在網絡上擷取資料而無需用一個activity來限制UI。其他元件,如activity,可以啟動service并讓它運作或者為了與之互動而綁定它。

service利用Service的子類實作,你可以在Service開發指導中學習更多。

内容提供者(Content Provider)

Content Provider管理共享的應用資料集合。你可以在系統檔案,SQLite資料庫,網絡或者其他應用可以通路的永久存儲位置中存儲資料。通過Content Provider,其他應用能夠查詢甚至修改資料(隻要content provider允許這樣)。例如,Android系統提供一個content provider來管理使用者聯系人資訊。如此,擁有适當權限的應用可以通路content provider(如ContactsContract.Data)來編輯聯系人資訊。

在讀寫應用的私有或非共享資料時,content provider同樣非常有用。例如,Note Pad應用使用一個content provider儲存便簽(note)。

content provider利用ContentProvider的子類實作,必須實作一套标準的APIs集合保證其他應用能夠完成處理。更多資訊請參見Content Providers開發文檔。

廣播接收者(Broadcast Receiver)

Broadcast Receiver是響應系統級廣播公告的元件。許多廣播——例如,通告螢幕關閉,電量低,或者抓獲照片的廣播由系統發起。應用也可以發起廣播——例如,讓其他應用知道資料已經下載下傳到裝置并可以使用。盡管broadcast receiver不在UI上顯示,當廣播事件發生時,他們可能建立一個狀态欄通知(create a status bar notification)來提醒(alert)使用者。更一般的說,broadcast receiver僅是一個給其他應用的”網關”(gateway 通道)并做少量的工作。舉例說明,它可能發起一個基于事件完成動作的服務。

Broadcast Receiver利用BroadcastReceiver的子類實作,每個廣播是用Intent對象傳遞。更多的資訊,參見BroadcastReceiver類。

     Android系統設計的一個獨特方面是任何應用可以啟動其他應用的元件。例如,如果你想要使用者擷取一張照片,可能是有其他應用做這事,同時你的應用也能使用它,而不是自己開發一個照相activity。你不需要合并甚至不需要從照相應用擷取代碼。反而,你可以簡單的啟動照相應用中的擷取照片的Activity。完成時,照片傳回給你的應用然後你可以使用它。對于使用者來說,照相機看起來像你應用的一部分。

當系統啟動一個元件時,它啟動應用的程序(如果它沒有在運作)同時執行個體化元件需要的類。例如,如果你的應用啟動照相應用中的擷取照片的activity時,activity運作在照相應用的程序中,而不是在你的應用的程序中。是以,不同于其他系統的應用,Android應用沒有一個單一的入口點(這裡沒有main()方法)。

    因為系統在各自的程序中運作應用,它(程序)能限制其他應用通路檔案,你的應用不能直接激活其他應用的元件。然後,Android系統可以。是以,為了激活其他應用中的元件,你必須指定你的意圖(Intent)傳遞一個消息給系統來啟動特定的元件。然後系統為你激活元件。

三、激活元件

三個元件——activity,service和broadcast receiver用一個稱為Intent的異步消息激活。Intent(意圖)在運作時刻綁定個别元件到其他的元件(可以想象為送信者(messengers)需要從其他元件擷取一個動作(action)),不論這個元件屬于你的應用還是其他的。

Intent利用Intent對象建立,這個對象定義了一個激活特定元件或者某種類型的元件——intent可以是明晰的或者暗含的(explicit or implicit)。

對于activity和service,intent定義需完成的動作(例如,為了顯示或發送某些東西)同時可能指定作用于資料的URI(元件啟動可能需要的其他東西)。例如,intent可能給activity傳達一個請求顯示圖像或者打開網頁。某些情況下,你可以啟動activity來接收結果,這時,activity也在Intent中傳回結果(例如,你可以發起Intent讓使用者選擇一個聯系人并傳回給你——傳回的Intent包含一個指向已選聯系人的URI)。

對于broadcast receiver,intent僅僅定義廣播通告(例如,表明裝置電量低的broadcast隻包含一個已知字元串動作“battery is low”)。

其他元件類型,content provider,不是通過Intent激活。當然,把一個ContentResolver的請求作為目标時激活。内容解析者(content resolver)處理所有直接與ContentProvider交易,是以元件不需要與provider完成交易隻要在ContentResolver對象中調用方法即可。這在Content Provider和請求資訊的元件之間留下一個抽象層(為了安全性)。

這裡是激活各自元件的方法:

l  你可以通過Intent傳遞startActivity()或startActivityForResult()(當你需要activity傳回一個結果)來啟動activity(或者讓他做一些新的事物)。

繼續閱讀