標籤:根據 範圍 相容性 wrap features ash 難度 recipe raw
我們在翻看一些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將得到系統提供的預設啟動表徵圖。要使用自訂表徵圖,首先添加您的.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>
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 進行配置和調整