5xamarin.android 中如何对AndroidManifest.xml 进行配置和调整

枕上诗书闲处好,门前风景雨来佳。这篇文章主要讲述5xamarin.android 中如何对AndroidManifest.xml 进行配置和调整相关的知识,希望能为你提供帮助。
降低学习成本是每个.NET传教士义务与责任。
建立生态,保护生态,见者有份。
我们在翻看一些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" />

【5xamarin.android 中如何对AndroidManifest.xml 进行配置和调整】[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  调试模式中并不会在配置权限界面出现即不会出现在下图红框中
5xamarin.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 FeaturesAndroidManifest.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 ElementAndroidManifest.xml  还提供了一种方法,可以为整个应用程序声明属性。这是通过< application> 元素及其对应的应用程序自定义特性来完成的。注意,这些都是整个应用程序范围(程序集范围)设置。  您的整个应用程序声明< application> 全局的设置,然后在每个Activity的基础上重写这些设置(根据需要)。
例如,下面的应用程序属性被添加到  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

    推荐阅读