如何修复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
相关产品推荐
相关产品推荐

