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

.NET MAUI Blazor应用Intent处理异常:OnNewIntent未触发

问题根源及解决步骤

1. 核心问题:Activity启动模式错误

你的OnNewIntent从未触发,本质是MainActivity的启动模式未配置为复用实例的模式。默认启动模式下,系统每次收到Intent都会创建新的Activity实例,不会调用已存在实例的OnNewIntent方法,直接走OnCreate流程。

修正AndroidManifest.xml配置

找到MainActivity的节点,添加android:launchMode="singleTask",确保系统复用已存在的Activity实例:

<activity android:name=".MainActivity"
          android:launchMode="singleTask">
    <!-- 保留你已配置的Intent过滤规则 -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" android:host="mydomain.app" />
    </intent-filter>
</activity>

2. 修复OnNewIntent中的冗余代码

你当前代码里调用StartActivity(typeof(MainActivity))完全多余,会导致不必要的Activity栈操作。直接处理Intent并传递路径即可:

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);

    if (intent.Action != Intent.ActionView) return;
    var data = intent.DataString;
    if (string.IsNullOrWhiteSpace(data)) return;

    var path = data.Replace(@"https://mydomain.app", "");
    // 用Preferences存储路径,供Blazor页面读取
    Preferences.Set("IntentPath", path);

    // 实时通知Blazor页面导航(可选,避免等待页面渲染)
    MessagingCenter.Send(this, "NavigateToIntent", path);
}

3. 完善Main.razor的导航逻辑

当前代码仅在OnAfterRender处理,需补充冷启动和实时消息监听的逻辑,覆盖所有场景:

@code
{
    [Inject]
    public NavigationManager NavigationManager { get; set; }

    protected override void OnInitialized()
    {
        // 处理冷启动时的Intent路径(应用从关闭状态被Intent唤起)
        HandleIntentNavigation();
        // 监听来自OnNewIntent的实时导航通知
        MessagingCenter.Subscribe<MainActivity, string>(this, "NavigateToIntent", (_, path) =>
        {
            NavigationManager.NavigateTo(path);
            Preferences.Remove("IntentPath");
        });
    }

    protected override void OnAfterRender(bool firstRender)
    {
        // 冷启动时可能Blazor尚未初始化完成,这里补一次处理
        if (firstRender)
        {
            HandleIntentNavigation();
        }
    }

    private void HandleIntentNavigation()
    {
        var intentPath = Preferences.Get("IntentPath", string.Empty);
        if (!string.IsNullOrWhiteSpace(intentPath))
        {
            NavigationManager.NavigateTo(intentPath);
            Preferences.Remove("IntentPath");
        }
    }
}

4. 补充冷启动时的Intent处理

如果应用是完全关闭状态下被Intent唤起,OnNewIntent不会触发,需要在OnCreate中处理首次Intent:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    // 处理冷启动场景的Intent
    if (Intent.Action == Intent.ActionView)
    {
        var data = Intent.DataString;
        if (!string.IsNullOrWhiteSpace(data))
        {
            var path = data.Replace(@"https://mydomain.app", "");
            Preferences.Set("IntentPath", path);
        }
    }
}

内容的提问来源于stack exchange,提问作者Jimmy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:01:47