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

OneSignal-Xamarin SDK 后台点击推送通知触发应用重启问题问询

问题结论

点击后台通知触发应用重启不是OneSignal SDK的默认行为,该问题由Android端Activity启动模式配置错误导致,正常逻辑确实应该直接将后台存活的应用拉到前台,无需重建实例。参数无法传递是因为重建后应用进程的内存数据被清空,原有回调的上下文已失效。

修复方案

1. 修改MainActivity启动模式

打开Android项目的MainActivity.cs,在Activity属性中设置启动模式为SingleTop,避免重复创建Activity实例:

[Activity(
    Label = "你的应用名称",
    Icon = "@mipmap/ic_launcher",
    Theme = "@style/MainTheme",
    MainLauncher = true,
    LaunchMode = LaunchMode.SingleTop, // 新增/修改此行
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize
)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    // 原有业务代码
}

2. 重写OnNewIntent处理后台通知点击事件

设置SingleTop后,后台应用点击通知不会触发OnCreate,而是走OnNewIntent回调,需要在此处将通知Intent传给OneSignal处理:

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);
    // 传递通知Intent给OneSignal触发回调
    OneSignal.Android.NotificationOpenedReceiver.HandleIntent(this, intent);
}

3. 优化OnCreate逻辑避免重复初始化

添加savedInstanceState判空逻辑,防止重复创建App实例:

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    base.OnCreate(savedInstanceState);

    // 仅首次创建时初始化框架和App实例
    if (savedInstanceState == null)
    {
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        
        // OneSignal初始化逻辑
        OneSignal.Current.StartInit("你的OneSignal AppID")
            .HandleNotificationOpened(OnNotificationOpened)
            .EndInit();
        
        LoadApplication(new App());
    }

    // 冷启动时(应用被杀死后点击通知)处理通知Intent
    if (Intent?.Extras != null)
    {
        OneSignal.Android.NotificationOpenedReceiver.HandleIntent(this, Intent);
    }
}

4. 持久化通知参数避免丢失

如果需要跨页面/跨启动实例获取通知自定义参数,在回调中存入本地存储:

private void OnNotificationOpened(NotificationOpenedResult result)
{
    var additionalData = result.Notification.AdditionalData;
    if (additionalData != null)
    {
        // 存入本地存储,后续在业务页面读取
        Preferences.Set("push_custom_params", additionalData.ToString());
    }
    // 此处可添加跳转逻辑,直接跳转到通知对应的业务页面
}

排查注意事项

  • 检查AndroidManifest.xml中MainActivity的launchMode属性是否被其他配置覆盖,确认值为singleTop
  • 升级OneSignal SDK到最新稳定版,旧版本存在SingleTop模式兼容性问题
  • 不要在通知点击回调中添加销毁Activity、杀死进程的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:36:05