1. 程式人生 > >5、xamarin.android 中如何對AndroidManifest.xml 進行配置和調整

5、xamarin.android 中如何對AndroidManifest.xml 進行配置和調整

receive custom 5.1 包裝 view 調整 加權 啟動 callable

我們在翻看一些java的源碼經常會說我們要在AndroidManifest.xml 中添加一些東西。而我們使用xamarin裏面實際上是通過C#的特性Attribute進行標記實現的

我們創建一個Xamarin Android 項目MainActivity會有一個默認的一個標記特性

   [Activity(Label = "App", MainLauncher = true)]
    public class MainActivity : Activity

詳細的內容來自於

https://developer.xamarin.com/guides/android/advanced_topics/working_with_androidmanifest.xml/

下面我們將詳細的講解如何在Xamarin Android中使用。

概述

AndroidManifest.xml 是Android平臺中的一個功能強大的清單文件,它允許您描述應用程序對Android的功能和要求。然而,用好它並不容易。 Xamarin.Android通過添加自定義Attribute的到對應類中, 用於自動生成清單文件,以降低使用AndroidManifest.xml的難度。我們的目標是99%的用戶不需要手動修改AndroidManifest.xml.

AndroidManifest.xml 作為生成構建中的一部分,自定義Attribute將和Properties/AndroidManifest.xml

中的文件進行合並。(所以不用擔心你在AndroidManifest.xml手工定義的會被覆蓋掉)。由此合並生成xml文件可以在項目的obj目錄中看到:比如, 存在於obj/Debug/android/AndroidManifest.xml 文件。XML文件合並的過程非常簡單:

1、 通過掃描程序集中的特定標記並使用自定義Attribute去生成XML元素, 2、然後將這些元素都插入到AndroidManifest.xml中。

基礎

在編譯時,會對從Activity類派生的非抽象類進行掃描,並將[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]特性對抽象類型沒有影響;抽象類型將被忽略。

Activity Name

從Xamarin.Android 5.1開始Activity的name屬性默認值是基於被導出的類型的集合限定名的MD5SUM。這允許從兩個不同的程序集提供相同的完全限定名,而不會得到打包錯誤。(Xamarin.Android 5.1以前,活動的默認類型名稱是由小寫的名稱空間和類名創建的。)

如果您希望重寫此缺省值並顯式指定Activity的名稱,請使用name屬性:

[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}

這樣的用處是方便第三方調用等等。如果沒有這方面的需求可以不設置 使用缺省值即可。

以上代碼生成了下面的xml片段

<activity android:name="awesome.demo.activity" />

註意:使用Name屬性你應該僅用於為了向後兼容,因為這樣的設定將會減慢運行時的類型查找。如果您有遺留代碼,該代碼期望基於底層名稱空間和類名的活動的默認類型名稱,請參見Android Callable包裝器命名,以了解如何維護兼容性。

Activity Title Bar

默認情況下,在運行時,Android會給你的應用程序一個標題欄。這個值將用於/manifest/application/activity/@android:label中。在大多數情況下,這個值與類名不同。要在標題欄上指定應用程序的標簽,請使用標簽屬性。例如:

[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}

下面是生成的xml片段

<activity android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />

Launchable from Application Chooser

默認情況下,您的Activity不會出現在Android的應用程序啟動屏幕上。這是因為在您的應用程序中可能會有很多Activity,要指定應該從應用程序啟動程序中啟動哪一個,可以使用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>

Activity Icon

默認情況下,您的Activity將得到系統提供的默認啟動圖標。要使用自定義圖標,首先添加您的.pngResources/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>

Permissions

當你添加權限Android清單(AndroidManifest中權限中描述)。這些權限被保存在Properties/AndroidManifest.xml例如,如果您設置了網絡許可元素 Properties/AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

調試模式會自動添加一些權限以簡化調試(如:網絡權限 讀取擴展存儲權限)—— 這些設置只會出現在 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" />

在Release構建中(obj/Debug/android/AndroidManifest.xml)上面的權限將不會自動配置。如果你發現切換到Release版本時候會丟失調試版可用的權限,請檢查在您應用程序權限配置中是否已經顯式的設置了這個權限。

具體的操作請查看上圖(VS MAC 也類似)。

高級功能

Intent Actions and Features

AndroidManifest.xml 提供了一種描述Activity能力的方法。這是通過 Intents 和 [IntentFilter] 自定義屬性實現的。您可以使用IntentFilter構造器中的Categories屬性用於指定那些操作類型適合您的Activity。您至少需要提供一個actions (這也是為什麽要在構造器中要求提供actions的原因)。[IntentFilter] 允許您在一個Activity中定義多次. 比如:

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

AndroidManifest.xml 還提供了一種方法,可以為整個應用程序聲明屬性。這是通過<application>元素及其對應的應用程序自定義特性來完成的。註意,這些都是應用程序範圍(程序集範圍)設置,而不是每個Activity設置。通常,您將為您的整個應用程序聲明<application>屬性,然後在每個活動的基礎上重寫這些設置(根據需要)。

例如,下面的應用程序屬性被添加到 AssemblyInfo.cs表示應用程序可以被調試,它的用戶可讀名稱是My App,並且它使用了Theme.Light風格作為所有Activity的默認主題:

[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"
                ... />

在這個例子中,所有App中的Activity都將默認使用Theme.Light主題。如果你設置了一個Activity的主題為Theme.Dialog 那麽只有這個Activity會生效,其他的Activity依然是默認的Theme.Light主題。

設置[Application]特性並不是唯一的配置方式;同樣的,你可以直接修改Properties/AndroidManifest.xml 中<applicaiton>節點,你的設置將會和其他的Attribute進行合並後保存在obj/Debug/android/AndroidManifest.xml中,需要註意的是手工在xml中的配置會總是覆蓋掉自定義特性的設置

這裏有許多的整個app全局的屬性可以在<application>中進行配置,具體的可以查看下面的連接進行查看 Public Properties ApplicationAttribute.

List of Custom Attributes

其他相關的一些關於配置項的對應關系 都可以在這裏面得到答案

  • Android.App.ActivityAttribute : 生成 /manifest/application/activity XML
  • Android.App.ApplicationAttribute : 生成 /manifest/application XML fragment
  • Android.App.InstrumentationAttribute : 生成 /manifest/instrumentationXML fragment
  • Android.App.IntentFilterAttribute : 生成 //intent-filter XML fragment
  • Android.App.MetaDataAttribute : 生成 //meta-data XML fragment
  • Android.App.PermissionAttribute : 生成 //permission XML fragment
  • Android.App.PermissionGroupAttribute : 生成 //permission-group XML fragment
  • Android.App.PermissionTreeAttribute : 生成 //permission-tree XML fragment
  • Android.App.ServiceAttribute : 生成 /manifest/application/service XML fragment
  • Android.App.UsesLibraryAttribute : 生成 /manifest/application/uses-library XML fragment
  • Android.App.UsesPermissionAttribute : 生成 /manifest/uses-permissionXML fragment
  • Android.Content.BroadcastReceiverAttribute : 生成 /manifest/application/receiver XML fragment
  • Android.Content.ContentProviderAttribute : 生成 /manifest/application/provider XML fragment
  • Android.Content.GrantUriPermissionAttribute : 生成 /manifest/application/provider/grant-uri-permission XML fragment

5、xamarin.android 中如何對AndroidManifest.xml 進行配置和調整