.NET MAUI安卓应用配置Intents深度链接后如何处理意图响应
.NET MAUI Android 深度链接Intent响应实现方案
注意:请勿同时在AndroidManifest.xml和IntentFilter特性中重复配置相同的intent-filter规则,二者选其一即可,否则编译合并清单后会生成重复的匹配节点,导致链接唤起异常。如果使用IntentFilter特性配置,编译过程会自动将规则注入最终生成的清单文件,无需手动在manifest中重复编写对应activity的过滤器节点。
核心实现逻辑
深度链接的Intent数据只会在Android平台的MainActivity中分发,你需要覆盖两个生命周期方法,覆盖冷启动、后台唤起两种场景,再通过统一方法解析链接参数、执行业务逻辑:
- 冷启动场景:应用完全未运行时通过链接唤起,走
OnCreate生命周期 - 后台唤起场景:应用已在后台驻留时通过链接唤起,走
OnNewIntent生命周期
1. 重写OnCreate处理冷启动场景
在Platforms/Android/MainActivity.cs中重写OnCreate方法,在基础初始化完成后传入Intent做解析:
protected override void OnCreate(Bundle? savedInstanceState) { base.OnCreate(savedInstanceState); // 处理启动携带的深度链接 HandleDeepLinkIntent(Intent); }
2. 重写OnNewIntent处理后台唤起场景
同样在MainActivity中重写OnNewIntent方法,拿到新触发的Intent对象:
protected override void OnNewIntent(Intent? intent) { base.OnNewIntent(intent); // 更新当前Activity持有的Intent实例 Intent = intent; // 处理新传入的深度链接 HandleDeepLinkIntent(intent); }
3. 编写统一的链接解析和业务处理方法
在MainActivity中添加私有方法,统一校验Intent类型、提取链接参数,待MAUI框架初始化完成后执行跨平台路由等业务逻辑:
private void HandleDeepLinkIntent(Intent? intent) { // 过滤非深度链接的Intent if (intent?.Action != Intent.ActionView || intent.Data == null) { return; } // 提取深度链接Uri Android.Net.Uri linkUri = intent.Data; // 示例:从Uri中提取路径、路径段、查询参数 // 对应链接示例:https://test/group/1001?source=share string fullPath = linkUri.Path; // 取值:/group/1001 string groupId = linkUri.LastPathSegment; // 取值:1001 string source = linkUri.GetQueryParameter("source"); // 取值:share // 等待MAUI平台上下文初始化完成后,调度到UI线程执行业务逻辑 Microsoft.Maui.ApplicationModel.Platform.OnResume(Window); if (App.Current != null) { App.Current.Dispatcher.Dispatch(async () => { // 在此处编写你的业务逻辑,例如跳转到对应页面 // 示例:await Shell.Current.GoToAsync($"///groupDetail?groupId={groupId}"); }); } }
本地调试方法
你可以通过adb命令直接模拟深度链接唤起,不需要手动写网页测试:
adb shell am start -a android.intent.action.VIEW -d "https://test/group/1001?source=test" 替换为你的应用包名
补充说明
- 不要尝试在跨平台层(如
App.xaml.cs、页面ViewModel)直接获取Android原生Intent对象,平台数据只能通过原生Activity层拿到,解析完成后可以通过参数传递到跨平台层做路由。 - 如果你后续需要配置无需用户选择、直接唤起应用的Android App Links,需要在对应域名的服务器根目录放置
assetlinks.json关联文件,本地调试使用test作为host时不需要该配置。
内容的提问来源于stack exchange,提问作者Devin Michael
相关产品推荐
相关产品推荐

