AndroidManifest.xml
是 Android 平台中的一个功能强大的文件,可用于将应用程序的功能和要求描述到 Android。 但是,使用它并不容易。
Xamarin.Android 通过允许向类添加自定义属性,从而有助于最大程度地降低此难度,然后该属性将用于自动生成清单。 我们的目标是,99% 的用户不应该需要手动修改
AndroidManifest.xml
。
AndroidManifest.xml
作为生成过程的一部分生成,在
Properties/AndroidManifest.xml
中找到的 XML 与从自定义属性生成的 XML 合并。 生成的合并
AndroidManifest.xml
驻留在
obj
子目录中;例如,它驻留在调试版本的
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] 自定义属性。 You can specify which actions are appropriate for your activity with theIntentFilter 构造函数,以及哪些类别适用于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 属性添加到 AssemblyInfo.cs 以指示可以调试应用程序、其用户可读名称为 “我的应用”,并将 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> 属性的唯一方法。 或者,可以直接将属性插入 Properties <application>/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 片段