Xamarin.Forms中FirebasePushNotification插件OnNotificationOpened触发后Android应用重启
问题核心原因
- MainActivity默认启动模式为
Standard,点击通知时系统会创建全新的MainActivity实例,触发OnCreate方法重新加载App实例,导致App走构造函数重启。 - MainActivity的
OnCreate方法未做实例复用判断,无论是否是恢复场景都会执行LoadApplication(new App())创建新的App对象。
具体修复方案
1. 修改MainActivity启动模式
给MainActivity的Activity属性新增LaunchMode.SingleTop(栈顶复用模式)和AlwaysRetainTaskState(防止系统回收应用任务栈)配置,修改后如下:
[Activity(Label = "TestProject1", Theme = "@style/MyTheme.Splash", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, AlwaysRetainTaskState = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { // 原有代码 }
2. 修改OnCreate逻辑增加复用判断
仅在Activity首次创建(savedInstanceState为null)时加载App实例,恢复场景复用原有App实例,修改后OnCreate代码如下:
protected override void OnCreate(Bundle savedInstanceState) { base.Window.RequestFeature(WindowFeatures.ActionBar); base.SetTheme(Resource.Style.MainTheme); base.OnCreate(savedInstanceState); Rg.Plugins.Popup.Popup.Init(this); UserDialogs.Init(this); Xamarin.FormsGoogleMaps.Init(this, savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); FirebasePushNotificationManager.ProcessIntent(this ,Intent); // 仅首次创建时加载App,恢复场景跳过避免重建 if (savedInstanceState == null) { LoadApplication(new App()); } }
验证逻辑
修改后后台点击通知时,系统会复用已存在的MainActivity实例,直接走OnNewIntent方法处理通知 intent,触发OnNotificationOpened事件后正常走App的OnResume生命周期,不会再触发App构造函数重启应用。
如果修改后仍有问题,可以将LaunchMode改为LaunchMode.SingleTask即可解决。
内容的提问来源于stack exchange,提问作者denizkarlsefni
相关产品推荐
相关产品推荐

