5、xamarin.android 中如何對AndroidManifest.xml 進行配置和調整
我們在翻看一些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
1、 通過掃描程序集中的特定標記並使用自定義Attribute去生成XML元素, 2、然後將這些元素都插入到AndroidManifest.xml中。
基礎
在編譯時,會對從Activity類派生的非抽象類進行掃描,並將[Activity]特性聲明在它們上。然後它使用這些類和特性來構建清單。例如,參考以下代碼:
namespaceDemo { 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 進行配置和調整