Xamarin.Android能否通过代码特性定义<queries>元素替代Manifest配置
结论
你预想的将Queries属性作为IntentFilter特性一部分的写法不支持。
[IntentFilter]特性的作用是为当前应用导出的组件生成<intent-filter>节点,仅用于声明当前应用可响应的意图,和Android 11要求的<queries>包可见性声明是完全独立的两个Manifest配置项。官方实现的IntentFilterAttribute类本身没有定义Queries相关属性,编译阶段不会识别你自行添加的同名属性,更不会自动生成对应的<queries>节点。
可行实现方案
你不需要在多套环境的Manifest文件中重复编写相同配置,以下两种统一配置的方式都可以实现一次维护、所有环境生效:
方案1:使用官方提供的[Query]特性(推荐)
适配Android 11及以上版本的.NET for Android(原Xamarin.Android)提供了专门的[Query]特性,用于在代码中声明包可见性规则。你可以直接在C#代码中标记该特性,编译时配置会自动合并到最终生成的AndroidManifest文件中,和你使用的环境Manifest变体无关,不需要重复编写。
对应你需要配置多个自定义Scheme的场景,写法示例:
// 可标记在assembly级别,全局生效,仅需编写一次 [assembly: Query( IntentQueries = new [] { new IntentQuery( actions: new [] { Intent.ActionView }, dataSchemes: new [] { "customappscheme", "appscheme1", "appscheme2", "appscheme3", "appscheme4", "appscheme5" } ) } )] // 你原有的IntentFilter配置不需要改动 [IntentFilter( new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, DataHost = "mydomain.com", DataScheme = "http" )] public class MainActivity : Activity { // 业务代码 }
编译后生成的Manifest会自动包含你配置的所有Scheme对应的
<queries>节点,覆盖所有构建变体。
方案2:配置Manifest合并覆盖文件
如果你使用的SDK版本暂不支持[Query]特性,可以在项目中新建一个独立的XML文件存放公共的<queries>配置,将文件的生成操作设置为AndroidManifestOverlay,构建系统会自动将该文件的配置合并到所有环境变体的最终Manifest中,同样不需要重复维护多份配置。
该XML文件的内容示例:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="customappscheme" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="appscheme1" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="appscheme2" /> </intent> <!-- 其余自定义Scheme对应的intent节点统一在此处维护 --> </queries> </manifest>
内容的提问来源于stack exchange,提问作者iBobb
相关产品推荐
相关产品推荐

