【正文】
e. Broadcast receivers A broadcast receiver is a ponent that responds to systemwide broadcast announcements. Many broadcasts originate from the system—for example, a broadcast announcing that the screen has turned off, the battery is low, or a picture was captured. Applications can also initiate broadcasts—for example, to let other applications know that some data has been downloaded to the device and is available for them to use. Although broadcast receivers don39。s possible to arrange for two applications to share the same Linux user ID, in which case they are able to access each other39。 12 附錄 B 外文原文 Android Application Fundamentals Writer. Android applications are written in the Java programming language. The Android SDK tools pile the code—along with any data and resource files—into an Android package, an archive file with an .apk suffix. All the code in a single .apk file is considered to be one application and is the file that Androidpowered devices use to install the application. Once installed on a device, each Android application lives in its own security sandbox: The Android operating system is a multiuser Linux system in which each application is a different user. By default, the system assigns each application a unique Linux user ID (the ID is used only by the system and is unknown to the application). The system sets permissions for all the files in an application so that only the user ID assigned to that application can access them. Each process has its own virtual machine (VM), so an application39。 另一個(gè)例子,對(duì)于不同的設(shè)備屏幕和大小,你應(yīng)當(dāng)為你的 activities 創(chuàng)建不同的布局。例如,在 XML 中定義 UI 字符串,你可以將這些字符串翻譯成其他語言并保存在特定的文件夾中。 使用應(yīng)用程序資源文件,可以更容易地更新你的應(yīng)用程序的特性而無需修改代碼,并且 — 通過提供多套可替換資源文件 — 使您能夠針對(duì)各種設(shè)備配置優(yōu)化你的應(yīng)用程序 (比如不同語言或屏幕大小 )。 為你的應(yīng)用程序聲明所有這些要求至關(guān)重要,因?yàn)?,?dāng)你在 Android Market 上發(fā)布你的應(yīng)用程序時(shí), Market 使用這些聲明來過濾該應(yīng)用程序是否對(duì)于每臺(tái)設(shè)備可用。 不同地 Android 平臺(tái)設(shè)備通常運(yùn)行不同版本的 Android ,比如 Android 或者 Android 。如果你的程序需要某特定形式的輸 入方式,則你必須在 manifes 文件中使用usesconfiguration標(biāo)簽來聲明。這種情況下,你的程序必須在運(yùn)行時(shí)做一下檢查,來檢查這個(gè)設(shè)備是否含有照相機(jī),如果沒有照相機(jī)可用,則系統(tǒng)將會(huì)使使用照相機(jī)的相關(guān)程序不能 用。大多數(shù)的這些聲明僅是一些信息,而系統(tǒng)并不會(huì)讀取它們,但是其他的服務(wù)比如Android Market卻會(huì)閱讀這些聲明來幫助通過通過自己的設(shè)備搜索軟件的用戶過濾軟件。這樣,在你的程序中,一個(gè) activity就可以創(chuàng)建一個(gè)發(fā)送intent(ACTION_SEND),這樣當(dāng)你調(diào)用 startaActivity()時(shí),系統(tǒng)就會(huì)匹配郵件程序中的發(fā)送 activity并啟動(dòng)它。 當(dāng)你在程序的 manifest 文件中聲明一個(gè)組件之后,你可以有選擇包含intent filters,這些 intent filters 表明了組件對(duì)接收自其他程序的 intent 做出反應(yīng)的能力( capabilities)。然而, intents 真正強(qiáng)大的地方在與關(guān)于 intent 的 actions 的概念。然 8 而, broadcast receiver 既可以在 manifest 文件中聲明也可以在代碼中動(dòng)態(tài)創(chuàng)建( BroadcastReceiver),并通過調(diào)用 registerReceiver()在系統(tǒng)中注冊(cè)。 組件聲明 7 Manifest 文件的首要任務(wù)就是通知系統(tǒng)關(guān)于程序中要使用的組件。 另外,這個(gè) manifest 文件還聲明一些其他的東西,比如: 確定這個(gè)程序需要的所有權(quán)限,比如 Inter 訪問權(quán)限或者讀取用戶聯(lián)系人權(quán)限。 更多的關(guān)于 intent 的內(nèi)容,可以參看文檔中的 Intents and Intent Filters。 你可以通過傳遞一個(gè) Intent 給 startService()來 start 一個(gè) service(或者給一個(gè)正在運(yùn)行的 service 一些新的指令 (instructions))。 最后一種組件類型 content provider 并不是由 intent 來激活的( activate)。比如,一個(gè) intent 可能會(huì)為一個(gè) activity傳遞一個(gè)請(qǐng)求來展示一張圖片或者打開一個(gè)網(wǎng)頁(yè)。 激活組件 (Activating Components) 5 四大組件中的三個(gè)組件 ——activities、 services 和 broadcast receiver——是由一種叫 intent 的異步消息來激活的。所以,不像其他操作系統(tǒng)的中的程序一樣, Android 程序沒有一個(gè)單獨(dú)的入口點(diǎn)(比如沒有我們常見的 main()函數(shù))。當(dāng)拍完之后,拍好的照片甚至?xí)詣?dòng)返回給你的程序。 Android 系統(tǒng)設(shè)計(jì)的一個(gè)獨(dú)特方面是任何的一個(gè)程序都可以啟動(dòng)另一程序的組件。 ContentResolver 可以與任意內(nèi)容提供者進(jìn)行會(huì)話,與其合作來對(duì)所有相關(guān)交互通訊進(jìn)行管理。 內(nèi)容提供者 (Content providers) 內(nèi)容提供者將一些特定的應(yīng)用程序數(shù)據(jù)供給其它應(yīng)用程序使用。 廣播接收器沒有用戶界面。很多廣播是源自于系統(tǒng)代碼的 ──比如,通知時(shí)區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項(xiàng)。例如,當(dāng)用戶在另一個(gè)應(yīng)用程序時(shí),一個(gè) service 可在后臺(tái)播放音樂,或者是從網(wǎng)絡(luò)上獲取數(shù)據(jù),而不阻斷用戶與當(dāng)前 activity 的交互。例如,用戶需要分享一張照片,一個(gè)拍照應(yīng)用程序能夠啟動(dòng)郵件應(yīng)用程序的 activity 。共有四種組件類型: 活動(dòng) (Activities) 一個(gè) activity 代表用戶界面的一個(gè)獨(dú)立屏幕。比如說,如果你的應(yīng)用程序需要一個(gè)圖 片卷動(dòng)列 表,而另一個(gè)應(yīng)用程序已經(jīng)開發(fā)了一個(gè)合用的而又允許別人使用的話,你可以直接調(diào)用那個(gè)卷動(dòng)列表來完成工作,而不用自己再開發(fā)一個(gè)。 這涵蓋了基本就如何 Android 應(yīng)用程序在系統(tǒng)中存在這個(gè)文件的其余部分向您介紹: 框架的核心組件定義應(yīng)用程序。 這樣一來, Android 系統(tǒng)實(shí)現(xiàn)了 最小特權(quán)原則 , 也就是說,每個(gè)應(yīng)用程序,默認(rèn)情況下,只能訪問的組件 ,它需要做的工作,沒有更多,這將創(chuàng)建一個(gè)非常安全的環(huán)境,使應(yīng)用程序無法訪問的,這就是它沒有給予許可制度的部分。 默認(rèn)情況下,每個(gè)應(yīng)用程序的系統(tǒng)分配一個(gè) 唯一的 Linux用戶 ID(該 ID僅用于由系統(tǒng)是未知的應(yīng)用程序),系統(tǒng)設(shè)置所有的應(yīng)用程序中的文件權(quán)限,以便只有用戶 ID 分配給該應(yīng)用程序可以訪問它們。 一旦安裝在設(shè)備上,每個(gè) Android 應(yīng)用程序的生命在它自己的安全沙箱: 而 Android 操作系統(tǒng)是一個(gè)多用戶 Linux系統(tǒng)中,每個(gè)應(yīng)用程序是一個(gè)不同的用戶。 Android 的啟動(dòng)過程時(shí),應(yīng)用程序的任何組件需要被執(zhí)行,然后關(guān)閉該進(jìn)程時(shí),它不再需要或恢復(fù)時(shí),系統(tǒng)必須為其他應(yīng)用程序的內(nèi)存。 2 應(yīng)用程序可以請(qǐng)求訪問權(quán)限,如用戶的聯(lián)系人,短信,可安裝存儲(chǔ)( SD卡),攝像頭,藍(lán)牙等設(shè)備的數(shù)據(jù),所有 應(yīng)用程序的權(quán)限必須由用戶在安裝時(shí)授予。 應(yīng)用程序組件 (Application Components) Android 的核心功能之一就是一個(gè)應(yīng)用程序可以使用其它應(yīng)用程序的元素(如果那個(gè)應(yīng)用程序允許的話)。與在其它系統(tǒng)上的應(yīng)用程序不同,Android 應(yīng)用程序沒有為應(yīng)用準(zhǔn)備一個(gè)單獨(dú)的程序入口(比如說,沒有 main()方法), 而是為系統(tǒng)依照需求實(shí)例化提供了基 本的組件。應(yīng)次,不同的應(yīng)用程序能夠從任何一個(gè) activity 啟動(dòng) (只要郵件應(yīng)用程序允許 )。 service 不提供用戶界面。 廣播接收器 (Broadcast receivers) 廣播接收器是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件。所有的接收器均繼承自 BroadcastReceiver 基類。一般來說是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開它并獲取消息。然而,應(yīng)用程序并不直接調(diào)用這些方法,而是使用一個(gè) ContentResolver 對(duì)象,調(diào)用它的方 4 法作為替代。并確保那個(gè)相應(yīng)組件的實(shí)例的存在,必要時(shí)會(huì)創(chuàng)建那個(gè)實(shí)例。相反,你只需要在你的程序中打開這個(gè)拍照程序中的實(shí)現(xiàn)拍照功能的 Activity。比如,你的程序開啟了一個(gè)拍照功能程序的 Activity,這時(shí)系統(tǒng)會(huì)啟動(dòng)這個(gè) Activity所在的程序,所以這個(gè) Activity運(yùn)行在拍照功能的程序當(dāng)中,而不是在你的程序中。具體是這樣的實(shí)現(xiàn)的,為了激活( activate)其他程序中的組件,你必須向系統(tǒng)發(fā)送一個(gè)消息來詳細(xì)說明你要啟動(dòng)其他組件的意圖,這樣系統(tǒng)才會(huì)為你激活這個(gè)組件。 對(duì)于 activities 和 services,一個(gè) intent 定義了要執(zhí)行的操作( action) (比如,要 “view”或者 “send”什么 )和要操作的數(shù)據(jù) 的 URI。) 對(duì)于廣播接收者來說, intent 只是簡(jiǎn)單的定義了要廣播的內(nèi)容( 比如,一個(gè)用以表明電池電量很低的廣播僅包含了一個(gè)表明電池電量很低的字符串)。使用 startActivityForResult()你將得到一 個(gè)返回結(jié)果。 你可以通過調(diào)用 ContentResolver 的 query()方法來執(zhí)行一次 content provider的查詢操作。你的程序必須在這個(gè) manifest 文件聲明用到的所有的組件,并且這個(gè)manifest 文件必須在項(xiàng)目的根目錄下。 聲明該程序需要鏈接( link against)的 API 庫(kù)(不是 Andorid 的framework APIs),比如 Google Maps library。 你必須要用以下方式來聲明你的程序組件: activities: activity標(biāo)簽 services:service標(biāo)簽 broadcast receiver: receiver標(biāo)簽 content providers: provider標(biāo)簽 如果程序中用到 activities、 services 和 content providers,你沒有在 manifest文件中聲明,那么這些組件將不會(huì)被系統(tǒng)知道,結(jié)果就是你的程序不能運(yùn)行。你可以通過在 intent 中注明目標(biāo)組件的名字(使用的是組件的類名)來顯示的啟動(dòng)組件。 系統(tǒng)可以識(shí)別能對(duì)某 intent 做出反應(yīng)的方式是通過將接收到的 intent 和設(shè)備中其他程序的 manifest 文件的 intent filters 進(jìn)行比較實(shí)現(xiàn)的。 比如,在一個(gè)郵件程序中的一個(gè) activity可以編寫新的郵件,這樣的話你就需要在 manifest 文件中來聲明一個(gè) intent filter 來對(duì) “發(fā)送 ”intent響應(yīng)(為了發(fā)送郵件)。為了防止你的程序被安裝在不能正常運(yùn)行你的程序的較低 android 系統(tǒng)版本上,通過在 manifest 文件中聲明你的程序支持的設(shè)備和軟件,便變得尤其重要起