使用Android指令清單
AndroidManifest.xml是 Android 平臺中功能強大的檔案,可讓您將應用程式的功能和需求描述為 Android。 不過,使用並不容易。 Xamarin.Android 可讓您將自定義屬性新增至您的類別,進而協助您將自定義屬性降到最低,然後用來自動為您產生指令清單。 我們的目標是,99% 的使用者不應該需要手動修改 AndroidManifest.xml。
AndroidManifest.xml會當做建置程式的一部分產生,而且在 Properties/AndroidManifest.xml中找到的 XML 會與從自定義屬性產生的 XML 合併。 產生的合併AndroidManifest.xml位於 obj 子目錄中;例如,它位於 debug 組建的 obj/Debug/android/AndroidManifest.xml。 合併程式十分簡單:它會使用程式代碼內的自定義屬性來產生 XML 元素,並將這些專案插入AndroidManifest.xml。
基本概念
在編譯時期,會掃描元件是否有衍生自 Activity 的非abstract
類別,並在[Activity]
它們上宣告 屬性。 然後,它會使用這些類別和屬性來建置指令清單。 例如,請考慮下列程式碼:
namespace Demo
{
public class MyActivity : Activity
{
}
}
這會導致AndroidManifest.xml中不會產生任何專案。 如果您想要產生專案 <activity/>
,則必須使用 [Activity]
自訂屬性:
namespace Demo
{
[Activity]
public class MyActivity : Activity
{
}
}
此範例會讓下列 xml 片段新增至 AndroidManifest.xml:
<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
屬性 [Activity]
對 abstract
類型沒有任何影響; abstract
會忽略類型。
活動名稱
從 Xamarin.Android 5.1 開始,活動的型別名稱是以所匯出類型之元件限定名稱的 MD5SUM 為基礎。 這可讓從兩個不同的元件提供相同的完整名稱,而不會收到封裝錯誤。 (在 Xamarin.Android 5.1 之前,活動的預設類型名稱是從小寫命名空間和類別名稱建立的。
如果您要覆寫此預設值並明確指定活動的名稱,請使用 Name
屬性:
[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}
此範例會產生下列 xml 片段:
<activity android:name="awesome.demo.activity" />
注意
您應該只針對回溯相容性原因使用 Name
屬性,例如重新命名可能會讓運行時間的類型查閱變慢。 如果您有預期活動的默認類型名稱以小寫命名空間和類別名稱為基礎的舊版程序代碼,請參閱 Android 可呼叫包裝函式命名 ,以取得維護相容性的秘訣。
活動標題列
根據預設,Android 會在應用程式執行時提供標題列。
這個值是 /manifest/application/activity/@android:label
。
在大部分情況下,此值會與您的類別名稱不同。 若要在標題列上指定應用程式的標籤,請使用 Label
屬性。
例如:
[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}
此範例會產生下列 xml 片段:
<activity android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
可從應用程式選擇器啟動
根據預設,您的活動不會顯示在 Android 的應用程式啟動器畫面中。 這是因為您的應用程式中可能會有許多活動,而且您不希望每個活動都有圖示。 若要指定應該從應用程式啟動器啟動哪一個,請使用 MainLauncher
屬性。 例如:
[Activity (Label="Awesome Demo App", MainLauncher=true)]
public class MyActivity : Activity
{
}
此範例會產生下列 xml 片段:
<activity android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
活動圖示
根據預設,系統會提供您活動的預設啟動器圖示。 若要使用自定義圖示,請先將您的.png新增至 Resources/drawable、將其 [建置動作] 設定為 AndroidResource,然後使用 Icon
屬性來指定要使用的圖示。 例如:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]
public class MyActivity : Activity
{
}
此範例會產生下列 xml 片段:
<activity android:icon="@drawable/myicon" android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
權限
當您將許可權新增至 Android 指令清單時(如將許可權新增至 Android 指令清單中所述),這些許可權會記錄在 Properties/AndroidManifest.xml中。
例如,如果您設定 INTERNET
許可權,下列元素會新增至 Properties/AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
偵錯組建會自動設定一些許可權,讓偵錯變得更容易(例如 INTERNET
和 READ_EXTERNAL_STORAGE
) – 這些設定只會在產生的 obj/Debug/android/AndroidManifest.xml 中設定,而且不會顯示為 [必要許可權] 設定中啟用。
例如,如果您在 obj/Debug/android/AndroidManifest.xml 檢查產生的指令清單檔,您可能會看到下列新增的許可權元素:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在指令清單的發行組建版本中(在 obj/Debug/android/AndroidManifest.xml),這些許可權 不會 自動設定。 如果您發現切換至發行組建會導致您的應用程式失去偵錯組建中可用的許可權,請確認您已在應用程式的必要許可權設定中 明確設定此許可權 (請參閱 Visual Studio for Mac 中的建 > 置 Android 應用程式 ;請參閱 Visual Studio 中的屬性 > Android 指令清單 )。
進階功能
意圖動作和功能
Android 指令清單可讓您描述活動的功能。 這是透過 意圖 和 [IntentFilter]
自訂屬性。 您可以使用 指定適合您活動的動作 IntentFilter
建構函式,以及哪些類別適用於 Categories
屬性。 至少必須提供一個活動(這就是為什麼建構函式中提供活動的原因)。 [IntentFilter]
可以多次提供,而且每次使用都會在 內<activity/>
產生個別<intent-filter/>
的 元素。 例如:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]
[IntentFilter (new[]{Intent.ActionView},
Categories=new[]{Intent.CategorySampleCode, "my.custom.category"})]
public class MyActivity : Activity
{
}
此範例會產生下列 xml 片段:
<activity android:icon="@drawable/myicon" android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.SAMPLE_CODE" />
<category android:name="my.custom.category" />
</intent-filter>
</activity>
Application 元素
Android 指令清單也可讓您宣告整個應用程式的屬性。 這是透過 <application>
元素和其對應 專案、Application 自定義屬性來完成。 請注意,這些是全應用程式 (元件範圍) 設定,而不是個別活動設定。 一般而言,您會針對整個應用程式宣告 <application>
屬性,然後根據每個活動覆寫這些設定(視需要)。
例如,下列 Application
屬性會新增至 AssemblyInfo.cs ,以指出可以偵錯應用程式、其用戶可讀取的名稱是 My App,而且它會使用 Theme.Light
樣式作為所有活動的默認主題:
[assembly: Application (Debuggable=true,
Label="My App",
Theme="@android:style/Theme.Light")]
此宣告會在 obj/Debug/android/AndroidManifest.xml 中產生下列 XML 片段:
<application android:label="My App"
android:debuggable="true"
android:theme="@android:style/Theme.Light"
... />
在此範例中,應用程式中的所有活動都會預設為 Theme.Light
樣式。 如果您將活動的主題設定為 Theme.Dialog
,則只有該活動會使用 Theme.Dialog
樣式,而應用程式中的所有其他活動都會預設為 Theme.Light
元素中所設定的 <application>
樣式。
元素 Application
不是設定 <application>
屬性的唯一方式。 或者,您可以將屬性直接<application>
插入 Properties/AndroidManifest.xml 的 元素。 這些設定會合併到位於 obj/Debug/android/AndroidManifest.xml 的最後<application>
一個專案。 請注意,Properties/AndroidManifest.xml的內容一律會覆寫自定義屬性所提供的數據。
您可以在 元素中<application>
設定許多全應用程式屬性;如需這些設定的詳細資訊,請參閱 ApplicationAttribute 的公用屬性一節。
自訂屬性清單
- Android.App.ActivityAttribute :產生 /manifest/application/activity XML 片段
- Android.App.ApplicationAttribute :產生 /manifest/application XML 片段
- Android.App.InstrumentationAttribute :產生 /manifest/instrumentation XML 片段
- Android.App.IntentFilterAttribute :產生 intent-filter XML 片段
- Android.App.MetaDataAttribute :產生 meta-data XML 片段
- Android.App.PermissionAttribute :產生 permission XML 片段
- Android.App.PermissionGroupAttribute :產生 permission-group XML 片段
- Android.App.PermissionTreeAttribute :產生 permission-tree XML 片段
- Android.App.ServiceAttribute :產生 /manifest/application/service XML 片段
- Android.App.UsesLibraryAttribute :產生 /manifest/application/uses-library XML 片段
- Android.App.UsesPermissionAttribute :產生 /manifest/uses-permission XML 片段
- Android.Content.BroadcastReceiverAttribute :產生 /manifest/application/receiver XML 片段
- Android.Content.ContentProviderAttribute :產生 /manifest/application/provider XML 片段
- Android.Content.GrantUriPermissionAttribute :產生 /manifest/application/provider/grant-uri-permission XML 片段