1. 程式人生 > >Android官方文件中文版

Android官方文件中文版

Android 簡介

要了解應用的工作原理,請從應用基礎知識開始入手。

要立即開始編碼,請仔細閱讀構建您的第一個應用

Android 提供了一個內容豐富的應用框架,支援您在 Java 語言環境中為移動裝置開發創新應用和遊戲。在左側導航窗格列出的文件中,提供了有關如何使用各種 Android API 開發應用的詳細資訊。

如果您是 Android 應用開發新手,則需瞭解以下有關 Android 應用框架的基本概念,這一點至關重要:

應用提供多個入口點

Android 應用都是將各種可單獨呼叫的不同元件加以組合開發而成。例如,元件可以是為使用者介面提供一個螢幕的單個“Activity”,也可以是在後臺獨立執行工作的“服務”。

您可以使用 intent 從一個元件啟動另一個元件。甚至,您還可以啟動不同應用中的元件,例如,啟動地圖應用中的 Activity 以顯示地址。此模式可為單個應用提供多個入口點,並使任何應用均能夠像使用者“預設設定”一樣處理其他應用可能呼叫的操作。

瞭解詳情

應用可適應不同的裝置

Android 提供了一個自適應應用框架,可用以為不同的裝置配置提供獨特的資源。例如,您可以針對不同的螢幕尺寸建立不同的 XML 佈局檔案,系統將根據當前裝置的螢幕尺寸確定要應用的佈局。

如有任何應用功能需要相機等特定的硬體,則可在執行時查詢裝置功能的可用性。如有必要,您還可以宣告您的應用所必需的功能,使 Google Play 商店等應用市場不得在不支援這些功能的裝置上安裝您的應用。

瞭解詳情

構建您的第一個應用

歡迎從事 Android 應用開發!

本課將介紹如何構建您的第一個 Android 應用。您將學習如何使用 Android Studio 建立 Android 專案和執行可除錯版本的應用。您還將瞭解一些 Android 應用設計的基礎知識,包括如何構建簡單的介面和處理使用者輸入。

建立 Android 專案

本課將向您介紹如何使用 Android Studio 建立新的 Android 專案並說明該專案中的一些檔案。

  1. 在 Welcome to Android Studio 視窗中,點選 Start a new Android Studio project

    或者如果您已開啟專案,請選擇 File > New Project

  2. 在 New Project 螢幕中,輸入以下值:
    • Application Name:“My First App”
    • Company Domain:“example.com”

    您可能需要更改專案位置,但無需更改其他選項。

  3. 點選 Next
  4. 在 Target Android Devices 螢幕中,保留預設值並點選 Next
  5. 在 Add an Activity to Mobile 螢幕中,選擇 Empty Activity,然後點選 Next
  6. 在 Configure Activity 螢幕中,保留預設值並點選 Finish

經過一些處理後,Android Studio 將開啟 IDE。

下面讓我們花一點時間回顧一下最重要的檔案。

首先,請確保已開啟 Project 視窗(選擇 View > Tool Windows > Project),並從視窗頂部的下拉列表中選擇 Android 檢視。隨後,您可以看到下列檔案:

app > java > com.example.myfirstapp > MainActivity.java

這是主 Activity(您的應用的入口點)。當您構建和執行應用時,系統會啟動此  的例項並載入其佈局。

app > res > layout > activity_main.xml

此 XML 檔案會定義 Activity 介面的佈局。它包含一個帶有文字“Hello world!”的  元素。

app > manifests > AndroidManifest.xml

manifest 檔案描述應用的基本特性並定義其每個元件。

Gradle Scripts > build.gradle

您會看到具有此名稱的兩個檔案:一個用於專案,一個用於“應用”模組。每個模組均有自己的 build.gradle 檔案,但此專案當前僅有一個模組。您將主要使用模組的 build.gradle 檔案配置 Gradle 工具編譯和構建您的應用的方式。如需瞭解有關此檔案的更多資訊,請參閱配置構建

要執行該應用,請繼續學習下一課

執行您的應用

上一課中,您建立了一個可以顯示“Hello World”的 Android 專案。現在,您可以在真實裝置或模擬器上執行應用。

在真實裝置上執行

按照以下步驟設定您的裝置:

  1. 使用一根 USB 電纜將您的裝置連線到您的開發機器。如果您是在 Windows 上開發,可能需要為您的裝置安裝相應的 USB 驅動程式
  2. 按照以下步驟操作,在 Developer options 中啟用 USB debugging

    首先,您必須啟用開發者選項:

    1. 開啟 Settings 應用。
    2. (僅在 Android 8.0 或更高版本上)選擇 System
    3. 滾動到底部,然後選擇 About phone
    4. 滾動到底部,點按 Build number 7 次。
    5. 返回上一螢幕,在底部附近可找到 Developer options

    開啟 Developer options,然後向下滾動以找到並啟用 USB debugging

按照以下步驟操作,在您的裝置上執行應用:

  1. 在 Android Studio 中,點選 Project 視窗中的 app 模組,然後選擇 Run > Run(或點選工具欄中的 Run  )。
  2. 在 Select Deployment Target 視窗中,選擇您的裝置,然後點選 OK

Android Studio 會在您連線的裝置上安裝並啟動應用。

至此,“hello world”將在您的裝置上執行!要開始開發應用,請繼續學習下一課

在模擬器上執行

按照以下步驟操作,在模擬器上執行應用:

  1. 在 Android Studio 中,點選 Project 視窗中的 app 模組,然後選擇 Run > Run(或點選工具欄中的 Run  )。
  2. 在 Select Deployment Target 視窗中,點選 Create New Virtual Device
  3. 在 Select Hardware 螢幕中,選擇電話裝置(如 Pixel),然後點選 Next
  4. 在 System Image 螢幕中,選擇具有最高 API 級別的版本。如果您未安裝該版本,將顯示一個 Download 連結,因此,請點選該連結並完成下載。
  5. 點選 Next
  6. 在 Android Virtual Device (AVD) 螢幕上,保留所有設定不變,然後點選 Finish
  7. 返回到 Select Deployment Target 對話方塊中,選擇您剛剛建立的裝置,然後點選 OK

Android Studio 會在模擬器上安裝並啟動應用。

至此,“hello world”將在模擬器上執行!要開始開發應用,請繼續學習下一課

構建簡單的介面

在本課中,您將使用 Android Studio Layout Editor 建立一個佈局,其中包括一個文字框和一個按鈕。在下一課中,您會將文字框的內容傳送到另一個 Activity,讓應用響應按鈕點按操作。

圖 1.最終佈局的螢幕截圖

Android 應用的介面使用佈局ViewGroup 物件)和微件View 物件)層次結構構建。佈局是一種不可見的容器,用於控制其子檢視在螢幕上的位置。微件是介面元件,例如按鈕和文字框。

圖 2.ViewGroup 物件如何在佈局中形成分支並容納 View 物件的圖解

Android 為 ViewGroup 和 View 類提供了一個 XML 詞彙,因此您的大多數介面都在 XML 檔案中定義。不過,本課將向您介紹如何使用 Android Studio Layout Editor 建立佈局,而不是教您編寫一些 XML 程式碼。在佈局編輯器中,只需拖放檢視即可構建佈局,大大簡化了構建工作。

開啟佈局編輯器

首先,請按照以下步驟設定您的工作區:

  1. 在 Android Studio 的 Project 視窗中,開啟 app > res > layout > activity_main.xml
  2. 要為佈局編輯器留出更多空間,請選擇 View > Tool Windows > Project 以隱藏 Project 視窗,或者點選 Android Studio 左側的 Project  )。
  3. 如果您的編輯器顯示 XML 原始碼,請點選視窗底部的 Design 標籤。
  4. 點選 Select Design Surface  並選擇 Blueprint
  5. 點選工具欄中的 Show  並確保選中 Show Constraints
  6. 確保 Autoconnect 關閉。工具欄中的提示應為 Turn On Autoconnect  (因為它現在處於關閉狀態)。
  7. 點選工具欄中的 Default Margins,  然後選擇 16(您稍後仍然可以調整每個檢視的外邊距)。
  8. 點選工具欄中的 Device in Editor,  然後選擇 Pixel XL

您的編輯器現在應如圖 3 所示。

圖 3.顯示 activity_main.xml 的佈局編輯器

左下方的 Component Tree 視窗顯示佈局的檢視層次結構。在本例中,根檢視是 ConstraintLayout,僅包含一個 TextView 物件。

ConstraintLayout 是一種佈局,它根據同級檢視和父佈局的約束條件為每個檢視定義位置。這樣一來,您可以建立具有扁平檢視層次結構的簡單佈局和複雜佈局。也就是說,它可以避免對巢狀佈局(佈局內的佈局,如圖 2 所示)的需求,巢狀佈局會增加繪製介面所需的時間。

圖 4.ConstraintLayout 內放置的兩個檢視的圖解

例如,您可以宣告以下佈局(在圖 4 中):

  • 檢視 A 顯示在父佈局上方 16dp 處。
  • 檢視 A 顯示在父佈局左側 16dp 處。
  • 檢視 B 顯示在檢視 A 右側 16dp 處。
  • 檢視 B 與檢視 A 的頂部對齊。

在後面幾部分中,您將構建一個與此佈局類似的佈局。

新增一個文字框

圖 5.文字框被限制在父佈局的頂部和左側

  1. 首先,您需要移除佈局中已有的內容。因此,請點選 Component Tree 視窗中的 TextView,然後按 Delete。
  2. 在左側的 Palette 視窗中,點選左側窗格中的 Text,然後將 Plain Text 拖放到設計編輯器中靠近佈局頂部的位置。這是一個接受純文字輸入的  微件。
  3. 在設計編輯器中點選檢視。現在,您可以在每個角上看到大小調整手柄(正方形),並在每個邊上看到約束錨點(圓形)。

    為了能更好地控制,您可能需要使用工具欄中的按鈕放大編輯器。

  4. 點選並按住頂邊上的錨點,將其向上拖動,直至錨點吸附到佈局的頂部,然後釋放。這是一個約束條件 - 它指定檢視應位於距離佈局頂部 16dp 的位置(因為您將預設外邊距設定為 16dp)。
  5. 類似地,從檢視左側建立一個約束條件,將其限制在佈局左側。

結果應如圖 5 中的螢幕截圖所示。

新增一個按鈕

圖 6.按鈕被限制在文字框及其基線的右側

  1. 在 Palette 視窗中,點選左側窗格中的 Widgets,然後將 Button 拖放到設計編輯器中靠近右側的位置。
  2. 從按鈕左側建立一個約束條件,將其限制在文字框的右側。
  3. 要在水平對齊中約束檢視,您需要在文字基線之間建立一個約束條件。因此,請點選按鈕,然後點選 Edit Baseline, 它將顯示在設計編輯器中選定檢視的正下方。基線錨點顯示在按鈕內部。點選並按住此錨點,然後將其拖動到文字框中顯示的基線錨點。

結果應如圖 6 中的螢幕截圖所示。

:您還可以使用頂部或底部邊緣建立水平對齊,不過,按鈕在其影象周圍包含內邊距,因此如果您按照這種方式對齊這些檢視,視覺對齊將是錯誤的。

更改介面字串

要預覽介面,請點選工具欄中的 Select Design Surface  並選擇 Design。請注意,文字輸入使用“Name”預填充,按鈕標記為“Button”。現在,您將更改這些字串。

  1. 開啟 Project 視窗,然後開啟 app > res > values > strings.xml

    這是一個字串資源檔案,您應在這個檔案中指定所有介面字串。這樣您可以在一個位置管理所有介面字串,讓字串的查詢、更新和本地化變得更加容易(與您的佈局或應用程式碼中的硬編碼字串相比)。

  2. 點選編輯器視窗頂部的 Open editor。這將開啟 Translations Editor,它為新增和編輯您的預設字串提供了一個簡單的介面,並且有助於保持您的所有已翻譯字串井然有序。
  3. 圖 7.用於新增新字串的對話方塊

    點選 Add Key,  以文字框“提示文字”的形式建立新字串。
    1. 為鍵名輸入“edit_message”。
    2. 為值輸入“Enter a message”。
    3. 點選 OK
  4. 再新增一個名稱為“button_send”並且值為“Send”的鍵。

現在,您可以為每個檢視設定這些字串。點選標籤欄中的 activity_main.xml 以返回佈局檔案,然後按照以下步驟新增字串:

  1. 點選佈局中的文字框,如果 Attributes 視窗在右側還未顯示,請點選右側邊欄上的 Attributes  。
  2. 找到 text 屬性(當前設為“Name”)並刪除值。
  3. 找到 hint 屬性,然後點選文字框右側的 Pick a Resource  。在出現的對話方塊中,雙擊列表中的 edit_message
  4. 現在,點選佈局中的按鈕,找到 text 屬性,點選 Pick a Resource, 然後選擇 button_send

讓文字框大小靈活調整

要建立一個可以適應不同螢幕尺寸的佈局,您現在將讓文字框拉伸以填充剩餘的所有水平空間(扣除按鈕和所有外邊距後的空間)。

首先,請點選工具欄中的 Show  並選擇 Blueprint

圖 8.點選 Center Horizontally 的結果

圖 9.點選以將寬度更改為 Match Constraints

圖 10.現在,文字框將拉伸以填充剩餘空間

  1. 選擇兩個檢視(點選一個,按住 Shift 並點選另一個),然後右鍵點選任何一個檢視並選擇 Chain > Create Horizontal Chain

    是兩個或更多檢視之間的雙向約束條件,它讓您可以採用一致的方式放置連結的檢視。

  2. 選擇按鈕並開啟 Attributes 視窗。使用 Attributes 視窗頂部的檢視檢查器將右外邊距設定為 16。
  3. 現在,點選文字框以檢視其屬性。點選兩次寬度指示器,確保將其設定為 Match Constraints,如圖 9 中的標註 1 所示。

    “Match constraints”表示寬度將延長以符合水平約束條件和外邊距的定義。因此,文字框將拉伸以填充水平空間(扣除按鈕和所有外邊距後的空間)。

現在,佈局已經完成,應如圖 10 所示。

如果您的佈局沒有按照預計的效果顯示,請點選下方連結,檢視您的 XML 程式碼應當具有的外觀,並將其與您在 Text 標籤中看到的程式碼進行比較。(如果您的屬性以不同順序顯示,沒有問題。)

檢視最終佈局 XML

如需瞭解有關鏈和您可以對 ConstraintLayout 進行的所有其他操作的詳細資訊,請閱讀使用 ConstraintLayout 構建自適應介面

執行應用

如果已在上一課中將您的應用安裝到裝置上,只需點選工具欄中的 Apply Changes,  使用新佈局更新應用。或者點選 Run,  安裝並執行應用。

按鈕仍然沒有響應。要在點按按鈕時啟動另一個 Activity,請繼續學習下一課

啟動另一個 Activity

完成上一課的學習後,您已構建了一個應用,它可以顯示一個 Activity(單一螢幕)並帶有一個文字欄位和一個按鈕。在本課中,您將向 MainActivity 新增一些程式碼,這些程式碼可在使用者點按 Send 時啟動一個新的 Activity 來顯示訊息。

:本課假設您使用 Android Studio 3.0。

響應 Send 按鈕

按照以下步驟操作,在 MainActivity.java 中新增一個由按鈕呼叫的函式:

  1. 在檔案 app > java > com.example.myfirstapp > MainActivity.java 中,新增 sendMessage() 函式存根,如下所示: public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }

        /** Called when the user taps the Send button */
        public void sendMessage(View view) {
            // Do something in response to button
        }

    }

    您可能會看到一條錯誤,因為 Android Studio 無法解析用作函式引數的 View 類。因此,請點選,將您的游標放置在 View 宣告上,然後按 Alt + Enter(在 Mac 上,則按 Option + Return),執行快速修復。(如果出現一個選單,請選擇 Import class。)

  2. 現在,返回到 activity_main.xml 檔案,從按鈕呼叫此函式:
    1. 在佈局編輯器中點選以選擇按鈕。
    2. 在 Attributes 視窗中,找到 onClick 屬性並從下拉列表中選擇 sendMessage [MainActivity]

現在,當點按按鈕時,系統將呼叫 sendMessage() 函式。

記下此函式中的詳細資訊,要讓系統將此函式視為與 android:onClick 屬性相容,需要這些詳細資訊。具體來說,函式必須宣告以下內容:

  • 公共訪問
  • 空返回值
  • 以 View 作為唯一引數(它是之前點選的 View 物件)

接下來,您需要填寫此函式以讀取文字欄位的內容,並將該文字傳遞給另一個 Activity。

構建一個 Intent

 是指在相互獨立的元件(如兩個 Activity)之間提供執行時繫結功能的物件。 表示一個應用“執行某項操作的意向”。您可以將 intent 用於各種任務,但在本課中,您的 intent 用於啟動另一個 Activity。

在 MainActivity.java 中,新增 EXTRA_MESSAGE 常量和 sendMessage() 程式碼,如此處所示:

public class MainActivity extends AppCompatActivity {
    public static final String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /** Called when the user taps the Send button */
    public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.editText);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);

    }
}

Android Studio 將再次遇到 Cannot resolve symbol 錯誤,因此,請按 Alt + Enter(在 Mac 上,則按 Option + Return)。您的匯入應按如下所示方式結束:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

DisplayMessageActivity 仍有錯誤,但沒關係;您將在下一部分中修復該錯誤。

下面是 sendMessage() 中的操作:

  •  建構函式採用兩個引數:
    • 應用元件的 Class,系統應將 (在本例中,為應啟動的 Activity)傳遞至該類。
  •  函式將 EditText 的值新增到 intent。Intent 能夠以名為 extra 的鍵值對形式攜帶資料型別。您的鍵是一個公共常量 EXTRA_MESSAGE,因為下一個 Activity 將使用該鍵來檢索文字值。為 intent extra 定義鍵時最好使用應用的軟體包名稱作為字首。這可以確保在您的應用與其他應用互動時這些鍵始終保持唯一。
  •  函式將啟動  指定的 DisplayMessageActivity 例項。現在,您需要建立該類。

建立第二個 Activity

  1. 在 Project 視窗中,右鍵點選 app 資料夾並選擇 New > Activity > Empty Activity
  2. 在 Configure Activity 視窗中,為 Activity Name 輸入“DisplayMessageActivity”,然後點選 Finish(保留所有其他屬性設定為預設值)。

Android Studio 會自動執行三項操作:

  • 建立 DisplayMessageActivity.java 檔案。
  • 建立對應的 activity_display_message.xml 佈局檔案。
  • 在 AndroidManifest.xml 中新增必需的 <activity> 元素。

如果執行應用並在第一個 Activity 上點按按鈕,將啟動第二個 Activity,但它為空。這是因為第二個 Activity 使用模板提供的空佈局。

新增文字檢視

圖 1.位於佈局頂部中心的文字檢視

新 Activity 包括一個空白的佈局檔案,因此,現在您需要在訊息將要顯示的位置新增一個文字檢視。

  1. 開啟檔案 app > res > layout > activity_display_message.xml
  2. 點選工具欄中的 Turn On Autoconnect (Autoconnect 隨後應啟用,如圖 1 所示)。
  3. 在 Palette 視窗中,點選 Text,然後將 TextView 拖動到佈局中 - 將其放置在靠近佈局頂部中心的位置,使其吸附到出現的垂直線上。Autoconnect 將新增左側和右側約束條件,在水平中心放置檢視。
  4. 再從文字檢視的頂部建立一個約束條件,將其限制在佈局頂部,讓它看起來如圖 1 所示。

也可以在 Attributes 視窗中展開 textAppearance 並更改屬性(例如 textSize 和 textColor),對文字樣式進行一些調整。

顯示訊息

現在,您將修改第二個 Activity,以顯示第一個 Activity 傳遞的訊息。

  1. 在 DisplayMessageActivity.java 中,向 onCreate() 函式新增下列程式碼: @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
       
        // Get the Intent that started this activity and extract the string
        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

        // Capture the layout's TextView and set the string as its text
        TextView textView = findViewById(R.id.textView);
        textView.setText(message);

    }
  2. 按 Alt + Enter(在 Mac 上,則按 Option + Return)匯入缺少的類。您的匯入應按如下所示方式結束: import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;

新增向上導航

您的應用中不是主入口的每個螢幕(所有不是主螢幕的螢幕)都應提供導航,以便使用者在應用欄中點按“向上”按鈕後可以返回應用層次結構中的邏輯父螢幕。

您需要做的全部工作是在 AndroidManifest.xml 檔案中宣告哪個 Activity 是邏輯父項。因此,請開啟 app > manifests > AndroidManifest.xml 處的檔案,找到 DisplayMessageActivity 的 <activity> 標記,然後將其替換為以下程式碼:

<activity android:name=".DisplayMessageActivity"
          android:parentActivityName=".MainActivity" >
    <!-- The meta-data tag is required if you support API level 15 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

Android 系統現在會在應用欄中自動新增“向上”按鈕。

執行應用

現在,點選工具欄中的 Apply Changes,再次執行應用  。當應用開啟後,在文字欄位中鍵入一條訊息,點按 Send 以在第二個 Activity 中檢視顯示的訊息。

圖 2.兩個 Activity 的螢幕截圖

就這麼簡單,您的第一個 Android 應用已成功誕生!

要繼續學習 Android 應用開發的基礎知識,請點選下面的連結來學習下一課。

應用基礎知識

Android 應用採用 Java 程式語言編寫。Android SDK 工具將您的程式碼 — 連同任何資料和資原始檔 — 編譯到一個 APK:Android 軟體包,即帶有 .apk 字尾的存檔檔案中。一個 APK 檔案包含 Android 應用的所有內容,它是基於 Android 系統的裝置用來安裝應用的檔案。

安裝到裝置後,每個 Android 應用都執行在自己的安全沙箱內:

  • Android 作業系統是一種多使用者 Linux 系統,其中的每個應用都是一個不同的使用者;
  • 預設情況下,系統會為每個應用分配一個唯一的 Linux 使用者 ID(該 ID 僅由系統使用,應用並不知曉)。系統為應用中的所有檔案設定許可權,使得只有分配給該應用的使用者 ID 才能訪問這些檔案;
  • 每個程序都具有自己的虛擬機器 (VM),因此應用程式碼是在與其他應用隔離的環境中執行;
  • 預設情況下,每個應用都在其自己的 Linux 程序內執行。Android 會在需要執行任何應用元件時啟動該程序,然後在不再需要該程序或系統必須為其他應用恢復記憶體時關閉該程序。

Android 系統可以通過這種方式實現最小許可權原則。也就是說,預設情況下,每個應用都只能訪問執行其工作所需的元件,而不能訪問其他元件。 這樣便營造出一個非常安全的環境,在這個環境中,應用無法訪問系統中其未獲得許可權的部分。

不過,應用仍然可以通過一些途徑與其他應用共享資料以及訪問系統服務:

  • 可以安排兩個應用共享同一 Linux 使用者 ID,在這種情況下,它們能夠相互訪問彼此的檔案。 為了節省系統資源,可以安排具有相同使用者 ID 的應用在同一 Linux 程序中執行,並共享同一 VM(應用還必須使用相同的證書籤署)。
  • 應用可以請求訪問裝置資料(如使用者的聯絡人、簡訊、可裝載儲存裝置 [SD 卡]、相機、藍芽等)的許可權。 使用者必須明確授予這些許可權。 如需瞭解詳細資訊,請參閱 使用系統許可權

以上內容闡述了有關 Android 應用在系統記憶體在方式的基礎知識。本文的其餘部分將向您介紹以下內容:

  • 用於定義應用的核心框架元件
  • 您用來宣告元件和應用必需裝置功能的清單檔案
  • 與應用程式碼分離並允許您的應用針對各種裝置配置適當優化其行為的資源

應用元件

應用元件是 Android 應用的基本構建基塊。每個元件都是一個不同的點,系統可以通過它進入您的應用。 並非所有元件都是使用者的實際入口點,有些元件相互依賴,但每個元件都以獨立實體形式存在,併發揮特定作用 — 每個元件都是唯一的構建基塊,有助於定義應用的總體行為。

共有四種不同的應用元件型別。每種型別都服務於不同的目的,並且具有定義元件的建立和銷燬方式的不同生命週期。

以下便是這四種應用元件型別:

Activity

Activity 表示具有使用者介面的單一螢幕。例如,電子郵件應用可能具有一個顯示新電子郵件列表的 Activity、一個用於撰寫電子郵件的 Activity 以及一個用於閱讀電子郵件的 Activity。 儘管這些 Activity 通過協作在電子郵件應用中形成了一種緊密結合的使用者體驗,但每一個 Activity 都獨立於其他 Activity 而存在。 因此,其他應用可以啟動其中任何一個 Activity(如果電子郵件應用允許)。 例如,相機應用可以啟動電子郵件應用內用於撰寫新電子郵件的 Activity,以便使用者共享圖片。

Activity 作為  的子類實現,您可以在 Activity 開發者指南中瞭解有關它的更多詳情。

服務

服務是一種在後臺執行的元件,用於執行長時間執行的操作或為遠端程序執行作業。 服務不提供使用者介面。 例如,當用戶位於其他應用中時,服務可能在後臺播放音樂或者通過網路獲取資料,但不會阻斷使用者與 Activity 的互動。 諸如 Activity 等其他元件可以啟動服務,讓其執行或與其繫結以便與其進行互動。

服務作為  的子類實現,您可以在服務開發者指南中瞭解有關它的更多詳情。

內容提供程式

內容提供程式管理一組共享的應用資料。您可以將資料儲存在檔案系統、SQLite 資料庫、網路上或您的應用可以訪問的任何其他永久性儲存位置。 其他應用可以通過內容提供程式查詢資料,甚至修改資料(如果內容提供程式允許)。 例如,Android 系統可提供管理使用者聯絡人資訊的內容提供程式。 因此,任何具有適當許可權的應用都可以查詢內容提供程式的某一部分(如 ),以讀取和寫入有關特定人員的資訊。

內容提供程式也適用於讀取和寫入您的應用不共享的私有資料。 例如,記事本示例應用使用內容提供程式來儲存筆記。

內容提供程式作為  的子類實現,並且必須實現讓其他應用能夠執行事務的一組標準 API。 如需瞭解詳細資訊,請參閱內容提供程式開發者指南。

廣播接收器

廣播接收器是一種用於響應系統範圍廣播通知的元件。 許多廣播都是由系統發起的 — 例如,通知螢幕已關閉、電池電量不足或已拍攝照片的廣播。應用也可以發起廣播 — 例如,通知其他應用某些資料已下載至裝置,並且可供其使用。 儘管廣播接收器不會顯示使用者介面,但它們可以建立狀態列通知,在發生廣播事件時提醒使用者。 但廣播接收器更常見的用途只是作為通向其他元件的“通道”,設計用於執行極少量的工作。 例如,它可能會基於事件發起一項服務來執行某項工作。

Android 系統設計的獨特之處在於,任何應用都可以啟動其他應用的元件。 例如,如果您想讓使用者使用裝置的相機拍攝照片,很可能有另一個應用可以執行該操作,那麼您的應用就可以利用該應用,而不是開發一個 Activity 來自行拍攝照片。 您不需要整合甚至連結到該相機應用的程式碼,而是隻需啟動拍攝照片的相機應用中的 Activity。 完成拍攝時,系統甚至會將照片返回您的應用,以便您使用。對使用者而言,就好像相機真正是您應用的組成部分。

當系統啟動某個元件時,會啟動該應用的程序(如果尚未執行),並例項化該元件所需的類。 例如,如果您的應用啟動相機應用中拍攝照片的 Activity,則該 Activity 會在屬於相機應用的程序,而不是您的應用的程序中執行。因此,與大多數其他系統上的應用不同,Android 應用並沒有單一入口點(例如,沒有 main() 函式)。

由於系統在單獨的程序中執行每個應用,且其檔案許可權會限制對其他應用的訪問,因此您的應用無法直接啟動其他應用中的元件, 但 Android 系統卻可以。因此,要想啟動其他應用中的元件,您必須向系統傳遞一則訊息,說明您想啟動特定元件的 Intent。 系統隨後便會為您啟動該元件。

啟動元件

四種元件型別中的三種 — Activity、服務和廣播接收器 — 通過名為 Intent 的非同步訊息進行啟動。Intent 會在執行時將各個元件相互繫結(您可以將 Intent 視為從其他元件請求操作的信使),無論元件屬於您的應用還是其他應用。

Intent 使用  物件建立,它定義的訊息用於啟動特定元件或特定型別的元件 — Intent 可以是顯式的,也可以是隱式的。

對於 Activity 和服務, Intent 定義要執行的操作(例如,“檢視”或“傳送”某個內容),並且可以指定要執行操作的資料的 URI(以及正在啟動的元件可能需要了解的資訊)。 例如, Intent 傳達的請求可以是啟動一個顯示影象或開啟網頁的 Activity。 在某些情況下,您可以啟動 Activity 來接收結果,在這種情況下,Activity 也會在  中返回結果(例如,您可以發出一個 Intent,讓使用者選取某位聯絡人並將其返回給您 — 返回 Intent 包括指向所選聯絡人的 URI)。

對於廣播接收器, Intent 只會定義要廣播的通知(例如,指示裝置電池電量不足的廣播只包括指示“電池電量不足”的已知操作字串)。

Intent 不會啟動另一個元件型別 - 內容提供程式,後者會在成為  的請求目標時啟動。 內容解析程式通過內容提供程式處理所有直接事務,使得通過提供程式執行事務的元件可以無需執行事務,而是改為在  物件上呼叫方法。 這會在內容提供程式與請求資訊的元件之間留出一個抽象層(以確保安全)。

每種型別的元件有不同的啟動方法:

清單檔案

在 Android 系統啟動應用元件之前,系統必須通過讀取應用的 AndroidManifest.xml 檔案(“清單”檔案)確認元件存在。 您的應用必須在此檔案中宣告其所有元件,該檔案必須位於應用專案目錄的根目錄中。

除了宣告應用的元件外,清單檔案還有許多其他作用,如:

  • 確定應用需要的任何使用者許可權,如網際網路訪問許可權或對使用者聯絡人的讀取許可權
  • 根據應用使用的 API,宣告應用所需的最低 API 級別
  • 宣告應用使用或需要的硬體和軟體功能,如相機、藍芽服務或多點觸控式螢幕幕
  • 應用需要連結的 API 庫(Android 框架 API 除外),如 Google 地相簿
  • 其他功能

宣告元件

清單檔案的主要任務是告知系統有關應用元件的資訊。例如,清單檔案可以像下面這樣宣告 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>

在  元素中,android:icon 屬性指向標識應用的圖示所對應的資源。

在  元素中,android:name 屬性指定  子類的完全限定類名,android:label 屬性指定用作 Activity 的使用者可見標籤的字串。

您必須通過以下方式宣告所有應用元件:

您包括在原始碼中,但未在清單檔案中宣告的 Activity、服務和內容提供程式對系統不可見,因此也永遠不會執行。 不過,廣播接收器可以在清單檔案中宣告或在程式碼中動態建立(如  物件)並通過呼叫  在系統中註冊。

宣告元件功能

如上文啟動元件中所述,您可以使用  來啟動 Activity、服務和廣播接收器。 您可以通過在 Intent 中顯式命名目標元件(使用元件類名)來執行此操作。 不過,Intent 的真正強大之處在於隱式 Intent 概念。 隱式 Intent 的作用無非是描述要執行的操作型別(還可選擇描述您想執行的操作所針對的資料),讓系統能夠在裝置上找到可執行該操作的元件,並啟動該元件。 如果有多個元件可以執行 Intent 所描述的操作,則由使用者選擇使用哪一個元件。

系統通過將接收到的 Intent 與裝置上的其他應用的清單檔案中提供的 Intent 過濾器進行比較來確定可以響應 Intent 的元件。

當您在應用的清單檔案中宣告 Activity 時,可以選擇性地加入宣告 Activity 功能的 Intent 過濾器,以便響應來自其他應用的 Intent。 您可以通過將 <intent-filter> 元素作為元件宣告元素的子項進行新增來為您的元件宣告 Intent 過濾器。

例如,如果您開發的電子郵件應用包含一個用於撰寫新電子郵件的 Activity,則可以像下面這樣宣告一個 Intent 過濾器來響應“send” Intent(以傳送新電子郵件):

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

然後,如果另一個應用建立了一個包含 操作的 Intent,並將其傳遞到 ,則系統可能會啟動您的 Activity,以便使用者能夠草擬併發送電子郵件。

如需瞭解有關建立 Intent 過濾器的詳細資訊,請參閱 Intent 和 Intent 過濾器文件。

宣告應用要求

基於 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 安裝您的應用。

不過,您也可以宣告您的應用使用相機,但並不要求必須使用。 在這種情況下,您的應用必須將 required 屬性設定為 "false",並在執行時檢查裝置是否具有相機,然後根據需要停用任何相機功能。

裝置相容性文件中提供了有關如何管理應用與不同裝置相容性的詳細資訊。

應用資源

Android 應用並非只包含程式碼 — 它還需要與原始碼分離的資源,如影象、音訊檔案以及任何與應用的視覺呈現有關的內容。 例如,您應該通過 XML 檔案定義 Activity 使用者介面的動畫、選單、樣式、顏色和佈局。 使用應用資源能夠在不修改程式碼的情況下輕鬆地更新應用的各種特性,並可通過提供備用資源集讓您能夠針對各種裝置配置(如不同的語言和螢幕尺寸)優化您的應用。

對於您的 Android 專案中包括的每一項資源,SDK 構建工具都會定義一個唯一的整型 ID,您可以利用它來引用應用程式碼或 XML 中定義的其他資源中的資源。 例如,如果您的應用包含一個名為 logo.png 的影象檔案(儲存在 res/drawable/目錄中),則 SDK 工具會生成一個名為 R.drawable.logo 的資源 ID,您可以利用它來引用該影象並將其插入您的使用者介面。

提供與原始碼分離的資源的其中一個最重要優點在於,您可以提供針對不同裝置配置的備用資源。 例如,通過在 XML 中定義 UI 字串,您可以將字串翻譯為其他語言,並將這些字串儲存在單獨的檔案中。 然後,Android 系統會根據向資源目錄名稱追加的語言限定符(如為法語字串值追加 res/values-fr/)和使用者的語言設定,對您的 UI 應用相應的語言字串。

Android 支援許多不同的備用資源限定符。限定符是一種加入到資源目錄名稱中,用來定義這些資源適用的裝置配置的簡短字串。 再舉一例,您應該經常會根據裝置的螢幕方向和尺寸為 Activity 建立不同的佈局。 例如,當裝置螢幕為縱向(長型)時,您可能想要一種垂直排列按鈕的佈局;但當螢幕為橫向(寬型)時,應按水平方向排列按鈕。 要想根據方向更改佈局,您可以定義兩種不同的佈局,然後對每個佈局的目錄名稱應用相應的限定符。 然後,系統會根據當前裝置方向自動應用相應的佈局。

如需瞭解有關可以在應用中包括的不同資源型別以及如何針對不同裝置配置建立備用資源的詳細資訊,請閱讀提供資源

有關如何使用  API 來啟動應用元件(如 Activity 和服務)以及如何使您的應用元件可供其他應用使用的資訊。

有關如何建立  類例項的資訊,該類可在您的應用內提供一個具有使用者介面的獨立螢幕。

提供資源

有關如何通過適當構建 Android 應用來使應用資源與應用程式碼分離的資訊,包括如何針對特定裝置配置提供備用資源。

您可能還對以下內容感興趣:

裝置相容性

有關 Android 在不同裝置型別上工作方式的資訊,並介紹瞭如何針對不同裝置優化您的應用,或如何限制您的應用在不同裝置上的可用性。

系統許可權

有關 Android 如何通過一種許可權系統來限制應用對特定 API 訪問許可權的資訊,該系統要求徵得使用者同意,才允許您的應用使用這些 API。

提供資源

您應該始終外部化應用資源,例如影象和程式碼中的字串,這樣有利於您單獨維護這些資源。 此外,您還應該為特定裝置配置提供備用資源,方法是將它們分組到專門命名的資源目錄中。 在執行時,Android 會根據當前配置使用適當的資源。例如,您可能需要根據螢幕尺寸提供不同的 UI 佈局,或者根據語言設定提供不同的字串。

外部化應用資源後,即可使用在專案 R 類中生成的資源 ID 訪問這些資源。有關如何在應用中使用資源,我們將在訪問資源中討論。 本文件介紹如何對 Android 專案中的資源進行分組,以及如何為特定的裝置配置提供備用資源。

分組資源型別

您應將各種資源放入專案 res/ 目錄的特定子目錄下。例如,以下是一個簡單專案的檔案層次結構:

MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml

正如您在此示例中所看到的那樣,res/ 目錄包含所有資源(在子目錄下):一個影象資源、兩個佈局資源、啟動器圖示的 mipmap/ 目錄以及一個字串資原始檔。資源目錄名稱非常重要,將在表 1 中進行介紹。

:如需瞭解有關使用 mipmap 資料夾的詳細資訊,請參閱管理專案概覽

表 1. 專案 res/ 目錄內支援的資源目錄。

目錄 資源型別
animator/ 用於定義屬性動畫的 XML 檔案。
anim/ 定義漸變動畫的 XML 檔案。(屬性動畫也可以儲存在此目錄中,但是為了區分這兩種型別,屬性動畫首選 animator/目錄。)
color/ 用於定義顏色狀態列表的 XML 檔案。請參閱顏色狀態列表資源
drawable/

點陣圖檔案(.png.9.png.jpg.gif)或編譯為以下可繪製物件資源子型別的 XML 檔案:

  • 點陣圖檔案
  • 九宮格(可調整大小的點陣圖)
  • 狀態列表
  • 形狀
  • 動畫可繪製物件
  • 其他可繪製物件
mipmap/ 適用於不同啟動器圖示密度的可繪製物件檔案。如需瞭解有關使用 mipmap/ 資料夾管理啟動器圖示的詳細資訊,請參閱管理專案概覽
layout/ 用於定義使用者介面佈局的 XML 檔案。 請參閱佈局資源
menu/ 用於定義應用選單(如選項選單、上下文選單或子選單)的 XML 檔案。請參閱選單資源
raw/

但是,如需訪問原始檔名和檔案層次結構,則可以考慮將某些資源儲存在 assets/ 目錄下(而不是 res/raw/)。assets/ 中的檔案沒有資源 ID,因此您只能使用  讀取這些檔案。

values/

包含字串、整型數和顏色等簡單值的 XML 檔案。

其他 res/ 子目錄中的 XML 資原始檔是根據 XML 檔名定義單個資源,而 values/ 目錄中的檔案可描述多個資源。對於此目錄中的檔案,<resources> 元素的每個子元素均定義一個資源。例如,<string> 元素建立 R.string 資源,<color> 元素建立 R.color 資源。

由於每個資源均用其自己的 XML 元素定義,因此您可以根據自己的需要命名檔案,並將不同的資源型別放在一個檔案中。但是,為了清晰起見,您可能需要將獨特的資源型別放在不同的檔案中。 例如,對於可在此目錄中建立的資源,下面給出了相應的檔名約定:

請參閱字串資源樣式資源更多資源型別

xml/ 可以在執行時通過呼叫  讀取的任意 XML 檔案。各種 XML 配置檔案(如可搜尋配置)都必須儲存在此處。

注意:切勿將資原始檔直接儲存在 res/ 目錄內,這會導致出現編譯錯誤。

如需瞭解有關某些資源型別的詳細資訊,請參閱資源型別文件。

儲存在表 1 中定義的子目錄下的資源是“預設”資源