You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:48:52