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

Xamarin.Forms中FirebasePushNotification插件OnNotificationOpened触发后Android应用重启

问题核心原因

  1. MainActivity默认启动模式为Standard,点击通知时系统会创建全新的MainActivity实例,触发OnCreate方法重新加载App实例,导致App走构造函数重启。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:27:00