page.title=應用程式基礎知識 @jd:body
Android 應用程式是以 Java 程式語言編寫而成。Android SDK 工具可將您的程式碼 — 連同任何相關資料和資源檔案 — 編入 APK ( Android 套件,使用 {@code .apk} 後綴字詞的封存檔)。 APK 檔案包含 Android 應用程式的所有內容,搭載 Android 作業系統的裝置會使用這種檔案來安裝應用程式。
Android 應用程式安裝到裝置之後,便可在專屬的安全性沙箱中執行:
如此一來,Android 系統就會實作「最低權限原則」。換句話說,在預設情況下,所有應用程式只能存取執行工作時所需的元件。 這樣一來,應用程式便無法存取系統的某些部分,藉此建立十分安全的執行環境。
不過,應用程式可透過一些方式與其他應用程式分享資料,以及存取系統服務:
本文提供有關 Android 應用程式如何在系統中運作的基本概念,其餘部分則說明以下幾點:
應用程式元件是 Android 應用程式的重要設計模組。每個元件 都是系統進入您應用程式的不同要點。並非所有元件都是使用者的實際進入點;某些元件的定義取決於其他元件,但所有元件都是獨立的個體,扮演著特定角色 — 換句話說,每個元件都是獨特的設計模組,可協助定義您應用程式的整體行為。
應用程式元件可分為 4 種不同類型。每種類型的用途和生命週期均不相同,可定義元件的建立及刪除方式。
以下是應用程式元件的 4 種類型:
Activity 是實作成 {@link android.app.Activity} 的子類別;詳情請參閱 Activity 開發人員指南。
服務是實作成 {@link android.app.Service} 的子類別;詳情請參閱服務開發人員指南。
此外,內容供應程式也可用於讀取及寫入只有您應用程式能存取的不公開資料。 例如,Note Pad 範例應用程式可使用內容供應程式儲存記事。
內容供應程式是實作成 {@link android.content.ContentProvider} 的子類別,而且必須實作一組標準 API 以便讓其他應用程式執行交易。 如需詳細資訊,請參閱內容供應程式開發人員指南。
廣播接收器是實作為成 {@link android.content.BroadcastReceiver} 的子類別,而每個廣播都是由 {@link android.content.Intent} 物件所發出。 如需詳細資訊,請參閱 {@link android.content.BroadcastReceiver} 類別。
Android 系統設計的一項特色是,任何應用程式都可啟動其他應用程式的元件。 例如,假設您想讓使用者透過裝置相機拍攝相片,您的應用程式可利用其他具備相關功能的應用程式 (如果有的話) 以達到這個目標,這樣您就不必自行建立用於拍攝相片的 Activity。 您不需要納入或連結相機應用程式的程式碼,只要啟動相機應用程式中用於拍攝像片的 Activity 即可。 啟動相關 Activity 後,系統就會將相片傳回您的應用程式供您使用。對於使用者而言,相機就宛如是您應用程式的一部分。
當系統啟動某個元件後,就會啟動該應用程式的處理程序 (如果該應用程式目前並非處於執行中狀態) 並且呼叫該元件所需的類別。 例如,假設您的應用程式啟動相機應用程式中用於拍攝相片的 Activity,則該 Activity 會在隸屬於相機應用程式的處理程序中執行,而不是您應用程式的處理程序。因此,與大多數其他系統的應用程式不同,Android 應用程式沒有單一進入點 (例如沒有 {@code main()} 函式)。
系統是在個別處理程序 (具備檔案權限,可限制其他應用程式存取) 中執行每款應用程式,因此您的應用程式無法直接啟動其他應用程式的元件,不過 Android 系統可以。 基於這個原因,如要啟動其他應用程式的元件,您必須向指定「意圖」的系統發送訊息,以啟動特定元件。 系統隨後會為您啟用所需的元件。
4 種元件類型的其中 3 種 — Activity、服務和廣播接收器 — 是透過「意圖」這種非同步訊息啟用。意圖會在執行階段將元件與彼此繫結 (您可以意圖想成要求其他元件進行動作的傳令員),不論元件是否屬於您的應用程式。
意圖是使用 {@link android.content.Intent} 物件建立而成,該物件可定義訊息來啟用特定元件或特定「類型」的元件 — 意圖可以採取明確或隱含設定。
針對 Activity 和服務,意圖會定義要執行的動作 (例如「查看」或「傳送」某項目),並且可能會指定執行動作的目標資料 URI (以及通知要啟用的元件)。 例如,意圖可傳達某 Activity 的要求,顯示圖片或開啟網頁。 在某些情況下,您可以啟動 Activity 來接收結果,此時該 Activity 也會傳回{@link android.content.Intent} 的結果 (例如,您可以發出意圖讓使用者挑選聯絡人資料,並將該資訊傳回給您 — 傳回意圖會包含指向所選聯絡人的 URI )。
針對廣播接收器,意圖只會定義要廣播的通知 (例如,用於通知裝置電量不足的廣播只會包含指出「電池電量不足」的已知動作字串)。
其他元件類型和內容供應程式並非由意圖所啟用,而是在受 {@link android.content.ContentResolver} 發出的要求所指定時由系統啟用。 內容解析程式可處理內容供應程式的所有直接交易,因此與供應程式進行交易的元件不必呼叫 {@link android.content.ContentResolver} 物件的方法。 這樣會在內容供應程式與要求資訊 (基於安全目的) 之間保留抽象層。
用於啟用各種元件的方法有以下幾種:
如要進一步瞭解如何使用意圖,請參閱意圖和意圖篩選器。 如要進一步瞭解如何啟用特定元件,請參閱下列說明文件: Activity、服務、{@link android.content.BroadcastReceiver} 和內容供應程式。
Android 系統必須先讀取應用程式的 {@code AndroidManifest.xml} 檔案 (「宣示說明」檔案) 確認應用程式元件確實存在,才能啟動該元件。 您的應用程式必須在這個檔案中宣告本身的所有元件,而該檔案必須位於應用程式專案目錄的根目錄。
除了宣告應用程式的元件以外,宣示說明還可以進行許多工作,包括:
宣告說明的主要工作是將應用程式的元件告知系統。例如,宣告說明檔案可用如下方式宣告 Activity:
<?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>
在 <application>
元素中,{@code android:icon} 屬性會指向識別應用程式的圖示資源。
而在 <activity>
元素中,
{@code android:name} 屬性會指定 {@link
android.app.Activity} 子類別的完整類別名稱,{@code android:label} 屬性則會指定要當作 Activity 的使用者可見標籤使用的字串。
您必須用以下方式宣告所有應用程式元件:
<activity>
:Activity 適用的元素
<service>
:服務適用的元素
<receiver>
:廣播接收器適用的元素
<provider>
:內容供應程式適用的元素
系統看不到您納入來源但未在宣示說明中宣告的 Activity、服務和內容供應程式,因此系統無法執行這些項目。 不過,您可在宣示說明宣告廣播接收器,或是透過程式碼以動態方式建立廣播接收器 (將廣播接收器建立為 {@link android.content.BroadcastReceiver} 物件),然後呼叫 {@link android.content.Context#registerReceiver registerReceiver()} 向系統註冊廣播接收器。
如要進一步瞭解如何為應用程式建立宣示說明檔案,請參閱 AndroidManifest.xml 檔案。
如啟用元件所述,您可以使用 {@link android.content.Intent} 來啟動 Activity、服務和廣播接收器。如要這麼做,請在意圖中明確指定目標元件 (使用元件類別名稱)。 不過,意圖最大的功能在於「隱含意圖」的概念。 隱含意圖可簡單描述要執行的動作類型 (或是執行動作的資料依據) 以及讓系統在裝置中找出可執行動作的元件,然後加以啟動。 如果意圖指出有多個元件可執行動作,則使用者可選取要使用的元件。
系統會比對接受到的意圖與裝置上其他應用程式的宣示說明檔案中提供的意圖篩選器,藉此識別可回應意圖的元件。
在應用程式的宣示說明中宣告 Activity 時,您可視需要納入宣告 Activity 功能的意圖篩選器,以便讓 Activity 可回應其他應用程式的意圖。 您可以為元件宣告意圖篩選器,方法是將 {@code <intent-filter>} 元素新增為元件宣告元素的子元素。
例如,假設您以用於撰寫新郵件的 Activity 建置電子郵件應用程式,您可以下列方式宣告意圖篩選器來回應「傳送」意圖 (藉此傳送新郵件):
<manifest ... > ... <application ... > <activity android:name="com.example.project.ComposeEmailActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
接著,如果其他應用程式透過 {@link android.content.Intent#ACTION_SEND} 動作建立了意圖並傳送到 {@link android.app.Activity#startActivity startActivity()},系統就可能會啟動您的 Activity 讓使用者撰寫及傳送郵件。
如要進一不瞭解如何建立意圖篩選器,請參閱意圖和意圖篩選器。
並非所有搭載 Android 作業系統的裝置都能提供完整功能。 為了避免使用者在缺少應用程式所需功能的裝置上安裝您的應用程式,請務必在宣示說明檔案中宣告裝置和軟體需求,清楚定義您的應用程式支援的裝置類型。 大多數宣告僅供使用者參考,系統無法讀取,但 Google Play 等外部服務可讀取這些宣示,以便在使用者透過自己的裝置搜尋應用程式時提供篩選功能。
例如,假設您的應用程式需要相機且採用 Android 2.1 (API 級別 7) 導入的 API,建議您用下列方式在宣示說明檔案中宣告這些需求:
<manifest ... > <uses-feature android:name="android.hardware.camera.any" android:required="true" /> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" /> ... </manifest>
如此一來,「沒有」相機且搭載 Android 2.1「以下版本」的裝置就無法從 Google Play 安裝您的應用程式。
不過,您也可以宣告您的應用程式會使用相機,但相機並非應用程式的「必要」配備。 在這種情況下,應用程式的 {@code required}屬性必須設為 {@code "false"},而且應用程式必須在執行階段檢查裝置是否具備相機,並且視需要停用任何相機功能。
如要進一步瞭解如何管理應用程式與不同裝置的相容性,請參閱裝置相容性。
Android 應用程式是以程式碼等其他要素開發而成 — 例如圖片、音訊檔案以及與應用程式視覺效果相關的其他資源。例如,您必須使用 XML 檔案定義 Activity 使用者介面的動畫、選單、樣式、顏色以及版面配置。 使用應用程式資源可協助更新應用程式的各種特性,而不必修改程式碼 — 或是提供多組替代資源 — 藉此針對各種裝置設定 (例如不同的語言和螢幕大小) 最佳化您的應用程式。
針對您在 Android 專案中加入的所有資源,SDK 建置工具會定義一個整數 ID,讓您用於從應用程式的程式碼或 XML 中定義的其他資源參照特定資源。 例如,假設您的應用程式含有名為 {@code logo.png} 的圖片檔案 (儲存在 {@code res/drawable/} 目錄中),SDK 工具會產生名為 {@code R.drawable.logo} 的資源 ID,讓您用於參照圖片並將其插入使用者介面。
提供原始碼以外資源的一個重點是針對不同的裝置設定提供替代資源。 例如,您可以在 XML 中定義使用者介面字串,藉此將字串翻譯成其他語言,以及將這些字串儲存成個別檔案。 接著,視您附加到資源目錄名稱的語言「修飾語」 (例如代表法文字串值的 {@code res/values-fr/}),以及使用者的語言設定而定,Android 系統會為您的 UI 套用適當的語言字串。
Android 針對替代資源支援各種「修飾語」。修飾語是一個簡短字串;您可在資源目錄名稱中加入修飾語,藉此定義應使用這些資源的裝置設定。 例如,您通常需要為 Activity 建立多種版面配置 (視裝置螢幕的方向和大小而定)。 例如,假設裝置螢幕的方向為縱向 (直版),版面配置的按鈕就必須以垂直方向排列;假設裝置螢幕的方向為橫向 (寬版),則版面配置的按鈕就必須以水平方向排列。 如要根據螢幕方向變更版面配置,請建立兩種版面配置,然後為每個版面配置目錄名稱套用適當的修飾語。 如此系統就會根據目前的裝置方向,自動套用適當的版面配置。
如要進一步瞭解您可在應用程式中加入的資源類型,以及如何針對不同的裝置設定建立替代資源,請詳閱提供資源。