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
相关产品推荐
相关产品推荐

