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

如何修复MAUI安卓中‘Window was already created’崩溃问题?

问题:点击推送通知时MAUI应用崩溃,抛出"Window was already created"异常

已成功实现推送通知接收功能,但点击通知消息时应用崩溃并显示空白页,同时抛出以下异常:

System.InvalidOperationException: 'Window was already created'

调用栈信息:

0xFFFFFFFFFFFFFFFF in Android.Runtime.RuntimeNativeMethods.monodroid_debugger_unhandled_exception   C#
0x1A in Android.Runtime.JNINativeWrapper._unhandled_exception at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:13,5 C#
0x1E in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPL_V at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:126,26  C#
0x12 in Microsoft.Maui.Controls.Window.Microsoft.Maui.IWindow.Created at D:\a\_work\1\s\src\Controls\src\Core\Window\Window.cs:483,5    C#
0xB in Microsoft.Maui.LifecycleEvents.AppHostBuilderExtensions.<>c.<OnConfigureLifeCycle>b__2_0 at D:\a\_work\1\s\src\Core\src\Hosting\LifecycleEvents\AppHostBuilderExtensions.Android.cs:23,6 C#
0xD in Microsoft.Maui.MauiAppCompatActivity. at D:\a\_work\1\s\src\Core\src\Platform\Android\MauiAppCompatActivity.Lifecycle.cs:61,104  C#
0x1F in Microsoft.Maui.LifecycleEvents.LifecycleEventServiceExtensions.InvokeLifecycleEvents<Microsoft.Maui.LifecycleEvents.AndroidLifecycle.OnPostCreate> at D:\a\_work\1\s\src\Core\src\LifecycleEvents\LifecycleEventServiceExtensions.cs:31,5   C#
0x40 in Microsoft.Maui.MauiAppCompatActivity.OnPostCreate at D:\a\_work\1\s\src\Core\src\Platform\Android\MauiAppCompatActivity.Lifecycle.cs:61,4   C#
0x11 in Android.App.Activity.n_OnPostCreate_Landroid_os_Bundle_ at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-34/mcw/Android.App.Activity.cs:4488,4 C#
0x9 in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPL_V at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:125,5    C#

无法定位问题根源,求可行解决方案。


解决方案

1. 调整推送PendingIntent配置

确保创建PendingIntent时使用单实例标记,避免重复启动Activity:

var intent = new Intent(context, typeof(MainActivity));
intent.AddFlags(ActivityFlags.SingleTop | ActivityFlags.ClearTop);
// 添加通知携带的数据
intent.PutExtra("notification_payload", payload);

var pendingIntent = PendingIntent.GetActivity(
    context,
    notificationId, // 使用唯一ID避免PendingIntent复用冲突
    intent,
    PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Immutable);

注意:Android 12+必须指定Immutable或Mutable标记。

2. 在MainActivity中处理通知跳转逻辑

重写OnNewIntent方法,复用已存在的Activity实例处理通知跳转,避免触发窗口重复创建:

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);
    
    if (intent.HasExtra("notification_payload"))
    {
        var payload = intent.GetStringExtra("notification_payload");
        // 切换到UI线程执行导航逻辑
        MainThread.BeginInvokeOnMainThread(() =>
        {
            var mainPage = Application.Current.MainPage as NavigationPage;
            mainPage?.PushAsync(new NotificationDetailPage(payload));
        });
    }
}

3. 检查MAUI窗口生命周期代码

  • 排查MauiProgram.cs中是否存在重复注册窗口、手动调用Window.Created事件的逻辑,这类操作会和框架自动管理的生命周期冲突。
  • 确保推送处理逻辑中没有手动创建新Window实例的代码,复用Application.Current.Windows[0]即可。

4. 升级MAUI版本

部分旧版MAUI在后台启动场景下存在窗口生命周期bug,升级到最新稳定版(如.NET 8+)可修复这类问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:35:40