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

.NET MAUI通过Deep Link启动应用后的异常问题求助

异常原因分析

  1. Activity多实例冲突:Deep Link默认会启动新的MainActivity实例,导致应用同时存在多个Activity实例。切后台再恢复时,系统可能唤醒未登录状态的旧实例,从而出现跳回LoginPage的问题。多次重复操作后Activity栈彻底混乱,叠加资源泄漏触发崩溃。
  2. 相机资源未释放:PhotoPage未正确清理相机预览、相机对象等资源,重复进入页面后资源占用持续累积,最终因资源耗尽引发系统崩溃。
  3. 导航栈残留页面:登录后LoginPage仍保留在导航栈中,系统恢复页面时可能错误回退到该页面。

解决办法

1. 调整Activity启动模式

修改MainActivity的启动模式为SingleTask,确保Deep Link启动时复用已有Activity实例,避免多实例导致的栈混乱:

[Activity(Theme = "@style/Maui.SplashTheme", 
          MainLauncher = true, 
          LaunchMode = LaunchMode.SingleTask,
          ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);
        // 可在此处理后续Deep Link请求,避免重复初始化导航逻辑
    }
}

2. 清理登录后的导航栈

登录跳转时清除之前的LoginPage,确保导航栈中仅保留已登录后的页面:

// LoginPage中Login按钮点击事件
await Shell.Current.GoToAsync("//MenuPage", true);
// 或使用参数明确移除前序页面
await Shell.Current.GoToAsync(nameof(MenuPage), new Dictionary<string, object>(), true);

3. 释放相机资源

在PhotoPage中重写OnDisappearing方法,主动清理相机资源:

protected override void OnDisappearing()
{
    base.OnDisappearing();
    // 停止预览并释放相机对象(根据你的相机实现调整)
    if (_cameraPreview != null)
    {
        _cameraPreview.StopPreview();
        _cameraPreview.Dispose();
        _cameraPreview = null;
    }
}

4. 优化Deep Link处理逻辑

确保仅在应用首次启动时处理Deep Link跳转,后续的Deep Link请求避免重置导航状态,防止干扰已有的页面栈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:16