應用程式基礎知識

您可以使用 Kotlin、Java 程式設計語言和 C++ 語言編寫 Android 應用程式。Android SDK 工具 將程式碼以及任何資料和資源檔案加入 APK 或 Android App Bundle。

Android 套件是具有 .apk 後置字串的封存檔案,並包含 Android 應用程式執行時所需的內容,而是根據 Android 技術提供的檔案 安裝應用程式的裝置數。

Android App Bundle 是具有 .aab 後置字串的封存檔案,當中含有 下載 Android 應用程式專案的內容,包括 執行階段。AAB 是一種發布格式,因此無法安裝在 Android 裝置上。這項服務 延遲產生 APK 及簽署之後的階段。

透過 Google 發行應用程式時 舉例來說,Google Play 伺服器會產生僅包含相關資源和 Google Play 伺服器的最佳化 APK 要求安裝應用程式的裝置所要求的程式碼。

每個 Android 應用程式都有專屬的安全沙箱,受到 下列 Android 安全性功能:

  • Android 作業系統是多使用者 Linux 系統,每個應用程式都是 不同的使用者
  • 根據預設,系統會為每個應用程式指派不重複的 Linux 使用者 ID,該 ID 僅供 但應用程式無法識別系統會為 應用程式,確保只有獲派該應用程式的使用者 ID 才能存取。
  • 每個程序都有自己的虛擬機器 (VM),因此應用程式的程式碼會獨立執行 或其他應用程式。
  • 根據預設,每個應用程式都會在各自的 Linux 程序中執行。Android 系統會啟動 程序 應用程式元件的所有元件,並關閉程序 信號消失時 或是系統必須復原其他應用程式的記憶體時。

Android 系統會採用最低權限原則。也就是說 在預設情況下,每個應用程式都只能存取執行工作所需的元件 。這項操作會建立安全無虞的環境,導致應用程式無法存取某些應用程式的部分內容 不授予系統任何權限

但可透過多種方式分享 和其他應用程式的資料 應用程式存取系統服務:

  • 如果有兩個應用程式可以安排共用相同的 Linux 使用者 ID, 他們可以存取彼此的檔案為了節省系統資源,具有 您也可以安排在相同的 Linux 程序中執行,並共用相同的 VM。 應用程式也必須使用相同的憑證簽署。
  • 應用程式可以要求存取裝置資料 (例如裝置的 位置資訊、相機和藍牙連線使用者擁有 明確授予這些權限如要進一步瞭解權限,請參閱 Android 中的權限

本文件其他部分會介紹下列概念:

  • 定義應用程式的核心架構元件。
  • 您在其中宣告元件和必要裝置的資訊清單檔案 您的 應用程式。
  • 與應用程式程式碼不同,且可讓應用程式存取的資源 妥善地針對各種裝置設定將行為最佳化。

應用程式元件

應用程式元件是 Android 應用程式的基本構成元素,每項 元件是進入點,系統或使用者可以進入應用程式的進入點。只有部分通知 依附於其他元件

應用程式元件分為四種類型:

  • 活動
  • 服務
  • 廣播接收器
  • 內容供應器

每種類型具有不同用途 且具有不同的生命週期,可定義元件的建立及刪除方式。 以下各節將說明應用程式元件的四種類型。

活動
活動是與使用者互動的進入點。代表了 以及使用者介面例如: 電子郵件應用程式可能會有一個活動,顯示一份 電子郵件、撰寫電子郵件的其他活動,以及閱讀電子郵件的其他活動。雖然 這些活動會互相搭配運作,在電子郵件應用程式中形成一致的使用者體驗,每項活動 彼此獨立

其他應用程式可以啟動下列任一項 活動。舉例來說,相機應用程式可能會啟動 電子郵件應用程式中的活動,用於撰寫新電子郵件,讓使用者分享相片。

活動有助於促進系統和應用程式之間的下列重要互動:

  • 持續追蹤使用者目前的關注內容 (螢幕上的內容), 系統會繼續執行代管活動的程序。
  • 瞭解先前使用的程序含有使用者可能會返回的已停止活動 並且提高這些程序的優先順序,以保持可用
  • 協助應用程式處理終止程序,以便使用者返回活動 還原為先前的狀態
  • 讓應用程式能在彼此之間實作使用者流程,也能讓系統 並協調這些流程最主要的例子是分享。

您將活動實作為 Activity 類別的子類別。如要 Activity 類別的相關資訊,請參閱 活動簡介

服務
服務是一種通用的進入點,可用於讓應用程式在背景執行 這是在背景執行的元件,用於執行長時間執行的作業 針對遠端程序執行的作業或執行工作。服務不提供使用者介面。

適用對象 舉例來說,當使用者離開其他應用程式時,服務可能會在背景中播放音樂;或 可以在不封鎖使用者與活動的互動的情況下,透過網路擷取資料。其他 活動 (例如活動) 可啟動服務,並允許其執行或繫結至該服務 與其互動

系統提供兩種服務來告知系統如何管理應用程式:已啟動的服務和 繫結服務

啟動的服務會指示系統持續運作,直到工作完成為止。 這類作業可能會在背景同步處理部分資料,或在使用者離開應用程式後播放音樂。 在背景中同步資料或播放音樂,代表不同類型的啟動作業 服務,這些處理程序會有所不同:

  • 音樂播放是使用者直接知道的內容,應用程式會將此訊息傳達給 要求系統應在前景執行,並顯示通知來告知您應位於前景 與使用者保持連線在此情況下,系統會優先 持續運作,因為即使停止遊戲,使用者的體驗不佳。
  • 一般背景服務不會讓使用者直接得知 系統對管理程序擁有更大的自由它或許會被殺死 如果應用程式需要 RAM 來執行更多工作, 可以立即取得解答

繫結服務之所以會運作,是因為某些應用程式 (或系統) 表示要這麼做 課程中也會快速介紹 Memorystore 這是 Google Cloud 的全代管 Redis 服務繫結服務提供 API 至另一個程序,而系統 且已知這些程序之間具有依附性因此,如果程序 A 繫結至 程序 B,系統知道需要讓程序 B 及其服務在 A 上執行。此外, 程序 A 是使用者重視的事項,只要知道程序 B 就視為 使用者也會在乎的

由於服務具有彈性,因此非常實用 體現各種高階系統概念的構成元素動態桌布、通知 事件監聽器、螢幕保護程式、輸入法、無障礙服務和其他許多核心系統功能 都是以應用程式實作的服務為基礎,在執行時會繫結至 Google 服務。

服務會實作為 Service 的子類別。如要進一步瞭解 有關 Service 類別的資訊,請參閱 服務總覽

注意:如果應用程式指定的是 Android 5.0 (API 級別 21) 以上版本, 使用 JobScheduler 類別安排動作。JobScheduler 提供 可有效排程工作以降低耗電量,進而節省電池電力 並透過 Doze API 使用。 如要進一步瞭解如何使用此類別,請參閱 JobScheduler 參考文件

廣播接收器
廣播接收器是一種元件,可讓系統傳送事件給 應用程式,但非正常使用者流程,這樣應用程式才能回應整個系統的廣播訊息 公告。由於廣播接收器是另一個明確定義的應用程式項目,因此系統 甚至可以向目前未在執行的應用程式放送廣播訊息。

舉例來說,應用程式 設定鬧鐘以發布通知,告知使用者近期活動。 由於鬧鐘會傳送到應用程式中的 BroadcastReceiver,因此應用程式不需要 在鬧鐘響起前持續運轉。

許多廣播訊息都來自系統,例如一則廣播訊息,說明螢幕已關閉。 電量不足,或是手機已擷取螢幕畫面。 應用程式也可以啟動廣播,例如讓其他應用程式知道 部分資料會下載到裝置,以便供日後使用。

儘管廣播 接收器不會顯示使用者介面,但可以建立狀態列通知 以便在直播事件發生時通知使用者。更常見的情況是 連結到其他元件的「閘道」,目的是將工作量極少。

舉例來說,廣播接收器可能會安排 JobService 以執行某些工作 使用 JobScheduler 標記活動。 廣播接收器經常涉及應用程式彼此互動,因此請務必留意 以瞭解安全方面的影響。

廣播接收器會實作為 BroadcastReceiver 的子類別。 且每個廣播訊息會以 Intent 物件的形式傳遞。如需更多資訊 請參閱 BroadcastReceiver 類別。

內容供應器
內容供應器會管理一組共用應用程式資料,並儲存在當中 例如檔案系統、SQLite 資料庫、網頁或任何其他永久儲存空間 你所在的 應用程式擁有哪些存取權透過內容供應器,其他應用程式可以查詢或修改 資料 (如果內容供應器允許)。

例如,Android 系統會提供 管理使用者聯絡資訊的供應商。任何具備適當權限的應用程式 權限可以查詢內容供應器 ContactsContract.Data,才能讀取及寫入 即可。

您可能會將內容供應器想成資料庫的抽象化機制,因為 而且內建許多 API 和支援不過 核心用途

對系統來說,內容供應器是應用程式的進入點,用於發布具名資料項目。 根據 URI 配置識別因此,應用程式可以決定其所含資料如何對應至 URI 命名空間,將這些 URI 分派給其他實體,從而使用這些 URI 存取 資料。系統管理應用程式時,執行下列特定操作:

  • 指派 URI 不需要應用程式持續執行,因此 URI 在其後仍可保留 使用者操作應用程式時系統只需要確定目前擁有的應用程式 系統從對應的 URI 擷取資料時仍持續執行。
  • 這些 URI 也提供了重要精密的安全性模型。舉例來說 應用程式可把剪貼簿中圖片的 URI 放入剪貼簿,但保留其內容 供應商鎖定,導致其他應用程式無法自由存取。第二次應用程式嘗試時 系統允許該應用程式存取剪貼簿中的 URI 透過臨時的 URI 權限授權存取資料 只存取該 URI 背後的資料,第二個應用程式則不會存取任何其他內容。

內容供應器也有助於讀取及寫入私人資料 而且不能分享

內容供應器會實作為 ContentProvider 的子類別 且必須實作一組標準 API,讓其他應用程式可以 交易詳情請參閱「內容供應器」開發人員。 指南。

Android 系統設計的獨特之處,在於任何應用程式皆可啟動 應用程式的元件舉例來說,如果您想讓使用者擷取 也許有另一個應用程式可以達成這項目標,你的 應用程式可以用這個方式,不必自行設計拍攝相片。不要 需要在相機應用程式中加入程式碼,甚至連結這些內容。 您可以改為在擷取 相片。完成後,相片也會傳回至應用程式供您使用。使用者 因為相機其實是應用程式的一部分

當系統啟動元件時,如果沒有,系統就會啟動該應用程式的程序 並將元件所需的類別例項化舉例來說 應用程式在相機應用程式中啟動活動,以拍攝相片、該活動 會在相機應用程式的處理程序中執行,而不是在應用程式的處理程序中執行。 因此,Android 應用程式不會只有單一項目,這一點與大部分其他系統上的應用程式不同 點:沒有 main() 函式。

每個應用程式都會以獨立程序執行,並具有檔案權限 限制存取其他應用程式,您的應用程式無法直接從中啟動元件 其他應用程式。不過,Android 系統可以。如何在 您傳送給系統的訊息,指定您的意圖 啟動特定元件然後,系統會為您啟用元件。

啟用元件

名為意圖的非同步訊息會啟用四種元件類型的三種:活動、服務及 廣播接收器。 意圖會在執行階段將個別元件繫結至彼此。你可以想出 是訊息傳遞者,要求其他元件執行動作,無論該元件是否為 加到您的應用程式或其他平台

使用 Intent 物件建立意圖,該物件會定義要接收的訊息 啟用特定元件 (明確意圖) 或特定類型的元件 (隱含意圖)。

針對活動和服務,意圖會定義要執行的動作,例如: 查看傳送資料,且可能會指定要處理的資料 URI,以及 可能需要知道

舉例來說,意圖可能會傳送 顯示圖片或開啟網頁在某些情況下,您可以在 但為了接收結果的活動,該活動也會傳回 結果。Intent您也可以發出意圖 使用者選擇個人聯絡人並退回給您。傳回意圖包括 指向所選聯絡人的 URI。

對於廣播接收器,意圖會定義 廣播公告例如廣播指出裝置電量不足的廣播訊息 僅包含已知動作字串,指出電量偏低

與活動、服務和廣播接收器不同 在 ContentResolver 要求指定時啟用。內容 解析器會處理與內容供應器之間的所有直接交易,以及 透過供應器呼叫方法 ContentResolver 物件。這麼做可以確保 內容供應器和元件要求資訊的元件

啟用每種元件的方法各有不同:

如要進一步瞭解如何使用意圖,請參閱意圖和 意圖篩選器文件。 以下文件提供如何啟用特定元件的詳細資訊: 活動簡介服務總覽BroadcastReceiver內容供應器

資訊清單檔案

在 Android 系統啟動應用程式元件之前,系統必須知道 讀取應用程式的資訊清單檔案 AndroidManifest.xml 來確認元件的存在。 您的應用程式會在這個檔案中宣告其所有元件,而這個檔案位於 應用程式專案目錄。

資訊清單除了宣告應用程式的元件之外,還執行了其他操作 例如:

  • 識別應用程式所需的任何使用者權限,例如網際網路存取權或 使用者聯絡人的讀取權限。
  • 宣告最小值 API 級別 視應用程式使用的 API 而定。
  • 宣告應用程式使用或所需的硬體和軟體功能,例如相機。 藍牙服務或多點觸控螢幕
  • 宣告應用程式需要連結的 API 程式庫 (而非 Android 架構) API),例如 Google 地圖程式庫

宣告元件

資訊清單的主要工作是向系統告知應用程式元件。適用對象 範例,資訊清單檔案可以宣告活動如下:

<?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>」中 元素,android:icon 屬性會指向圖示資源,用來識別 應用程式。

<activity> 元素中, android:name 屬性會指定 Activity 子類別和 android:label 屬性可指定字串 做為使用者可見的活動標籤

您必須使用下列元素宣告所有應用程式元件:

您在來源中加入,但未聲明的活動、服務和內容供應者 畫面上就不會顯示資訊清單中,因此也無法執行。不過 廣播 接收器的方法可能是在資訊清單中宣告,或是根據 BroadcastReceiver 物件,並藉由呼叫 registerReceiver()

如要進一步瞭解如何建構應用程式的資訊清單檔案,請參閱「應用程式資訊清單總覽」。

宣告元件功能

如「啟用元件」一節所述,您可以使用 Intent 來啟動活動、服務和廣播接收器。 您做得到 在意圖中使用元件類別名稱明確命名目標元件。 您還可以使用隱含意圖 說明要執行的動作類型,並視需要填入資料 執行相應操作隱含意圖可讓系統在裝置上尋找元件 能執行 並開始行動如果有多個元件可執行 也就是使用者選取要使用的意圖

注意:如果您使用意圖啟動 Service。建議您使用 煽情露骨內容 意圖。使用隱含意圖啟動服務是 安全性風險,因為您無法確定哪個服務會回應意圖 導致使用者看不到哪個服務啟動了。從 Android 5.0 (API 級別 21) 開始,系統 若呼叫 bindService(),就會擲回例外狀況 針對隱含意圖請勿為服務宣告意圖篩選器。

系統會比較 傳送到其他應用程式資訊清單檔案中提供的意圖篩選器的意圖 裝置。

在應用程式資訊清單中宣告活動時,您可以選擇納入 意圖篩選器會宣告活動的功能,以便回應意圖 。做法是 將 <intent-filter> 元素新增為元件宣告元素的子項。

舉例來說,假設您建構了一個電子郵件應用程式,其中包含用來撰寫新電子郵件的活動,您可以 宣告意圖篩選器以回應「傳送」傳送新電子郵件的意圖 如以下範例所示:

<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>

其他應用程式使用 ACTION_SEND 動作建立意圖,並傳遞至意圖為 startActivity(), 系統可能會啟動您的活動,以便使用者 電子郵件。

如要進一步瞭解如何建立意圖篩選器,請參閱意圖和意圖篩選器文件。

宣告應用程式規定

市面上有許多搭載 Android 的裝置,但並非所有裝置都能提供 相同的功能防止在裝置上安裝應用程式 但若其中缺少應用程式所需的功能,您必須為應用程式明確定義 您可依此宣告應用程式支援的裝置和軟體類型, 資訊清單檔案

這些聲明大部分僅供參考。系統不會讀取 但 Google Play 等外部服務會讀取這類政策 透過個人裝置搜尋應用程式時吸引他們的注意

舉例來說,假設應用程式需要相機,並使用 Android 8.0 (API 級別 26) 中導入的 API。 您必須宣告這些要求。 minSdkVersiontargetSdkVersion 的值已在 應用程式模組的 build.gradle 檔案:

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 26
    targetSdkVersion 29
  }
}

注意:請勿設定 minSdkVersiontargetSdkVersion 直接加入資訊清單檔案,因為 都會在建構過程中由 Gradle 覆寫。若需更多資訊,請參閲 指定 API 級別規定

您可以在應用程式的資訊清單檔案中宣告相機功能:

<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    ...
</manifest>

根據這些示例中的宣告,未使用 相機 Android 8.0 低於 8.0 版本的使用者無法從 Google Play 安裝您的應用程式。 不過,您也可以宣告應用程式使用相機,但不需要 要求。方法是將 required 屬性設為 false,請在執行階段檢查 裝置配備相機,並視情況停用任何相機功能。

進一步瞭解如何管理應用程式與不同裝置的相容性 請參閱「裝置相容性總覽」一文。

應用程式資源

Android 應用程式是由多種程式碼構成,您需要具備 例如圖片、音訊檔案以及任何與影像相關的內容 應用程式的呈現方式例如,你可以定義動畫、選單、樣式、顏色 以及活動使用者介面與 XML 檔案的版面配置。

使用應用程式資源 ,不必修改程式碼即可更新應用程式的各種特性。提供 透過多種替代資源,您可以依據各種因素將應用程式最佳化 例如不同的語言和螢幕尺寸

針對 Android 專案納入的各項資源,SDK 建構工具會定義 整數 ID,可用於從應用程式程式碼或 XML 中定義的其他資源舉例來說,如果您的應用程式含有名為 logo.png (儲存在 res/drawable/ 目錄中),SDK 工具會產生 名為 R.drawable.logo 的資源 ID。這個 ID 對應至應用程式專屬的整數 可用來參照圖片,並將圖片插入使用者介面中

提供不同於原始碼的一大重要面向 是能夠為其他裝置提供額外資源的能力 儲存空間設定

舉例來說,只要在 XML 中定義 UI 字串, 將這些字串轉換成 語言,並將這些字串儲存在不同檔案中。接著,Android 會將 適當的語言字串 將語言限定詞套用至使用者介面 您附加至資源目錄名稱後方的字串,例如,res/values-fr/ 代表法文字串 以及使用者的語言設定

Android 支援適用於替代資源的許多限定詞。 限定詞是簡短字串,您加入的資源目錄名稱中, 定義這些資源適用的裝置設定

適用對象 舉例來說,您可以為活動建立不同的版面配置 裝置的螢幕方向和大小裝置螢幕為直向時 (高) 您可能會希望版面配置的按鈕以垂直方式排列,但當螢幕處於水平狀態時 橫向 (寬版) 方向時,建議您讓按鈕水平對齊。如何變更版面配置 您可以根據螢幕方向定義兩個版面配置 限定詞套用至每個版面配置的目錄名稱。然後,系統會自動套用適當的設定 根據目前的裝置螢幕方向 自動調整版面配置

如需更多有關您可以納入應用程式中的各種資源,以及如何在應用程式中加入的資訊,請參閱 為不同的裝置設定建立額外資源,請參閱「應用程式資源總覽」。目的地: 進一步瞭解最佳做法,並設計出完善且品質媲美正式版的應用程式。 請參閱「應用程式架構指南」。

其他資源

如要透過影片和程式碼教學課程學習 Android 開發作業,請參閱 使用 Kotlin 開發 Android 應用程式 Udacity 課程。

繼續閱讀以下相關內容:

意圖和意圖篩選器
瞭解如何使用 Intent API 執行以下作業: 啟用應用程式元件,例如活動和服務,以及如何製作應用程式元件 供其他應用程式使用
活動簡介
瞭解如何建立 Activity 類別的例項。 為應用程式提供不同的畫面,並提供使用者介面。
應用程式資源總覽
瞭解 Android 應用程式的結構如何區隔應用程式資源與 應用程式的程式碼,包括如何為特定裝置提供額外資源 儲存空間設定

其他興趣:

裝置相容性總覽
瞭解 Android 在不同裝置類型的運作方式和 如何針對各種裝置最佳化應用程式,或限制應用程式的使用國家/地區 在不同裝置上都能使用
Android 中的權限
瞭解 Android 如何使用具有權限的 API 限制應用程式存取特定 API ,規定您的應用程式必須徵得使用者同意,才能使用這些 API。