Android 14(OneUI 6)本地推送通知行为异常问题排查求助
React Native本地推送在三星OneUI 6后台延迟/不送达的排查方向
排查三星OneUI 6电池优化限制
三星OneUI 6对后台应用的管控大幅收紧,尤其是App Standby Buckets和Doze模式,会延迟甚至冻结低优先级应用的定时任务:- 手动关闭目标应用的电池优化:路径为「设置 > 电池和设备维护 > 电池 > 后台使用限制 > 找到你的应用 > 设置为不受限制」,测试关闭后是否恢复正常。
- 检查应用是否被加入「深度睡眠」列表,该模式会彻底限制后台活动,需要将应用移出列表。
适配Android 12+精确闹钟权限
react-native-push-notification基于AlarmManager,而Android 12+(OneUI 6基于Android 13/14)要求后台精确定时必须申请SCHEDULE_EXACT_ALARM权限:- 在
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> - 运行时动态申请该权限(Android 12+强制要求),确保用户授权。
- 确认react-native-push-notification版本是否适配精确闹钟,旧版本可能仍使用普通定时API,建议升级到最新稳定版。
- 在
确保后台进程存活
三星OneUI 6会主动杀死长时间后台的应用进程,导致AlarmManager回调无法触发:- 用
adb shell dumpsys activity processes命令查看通知未送达时的应用进程状态,确认是否被杀死。 - 计时器运行期间启动前台服务,在AndroidManifest中声明
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />,并显示一个低优先级的常驻通知,防止进程被系统回收。
- 用
检查通知渠道配置
三星OneUI对低优先级通知会做延迟处理:- 创建通知渠道时设置
importance: 4(对应Android的Importance.HIGH),同时开启振动、声音提醒,确保通知不会被系统静默。 - 示例代码:
PushNotification.createChannel( { channelId: "rest_timer_channel", channelName: "休息计时器提醒", channelDescription: "休息时间到期通知", importance: 4, vibrate: true, sound: true }, (created) => console.log(`渠道创建状态: ${created}`) );
- 创建通知渠道时设置
模拟Doze模式验证
用Android Studio的设备工具模拟Doze模式,确认定时任务在低功耗状态下的表现:- 进入「Device Manager > 对应设备 > More Actions > Battery > Force Doze」,触发Doze后测试定时通知是否按时送达。
- 如果模拟下出现延迟,说明需要使用
setExactAndAllowWhileIdle()替代普通定时API,该API可在Doze模式下唤醒设备执行任务。
排查RN封装层问题
排除react-native-push-notification的封装bug:- 检查
localNotificationSchedule的date参数是否为精确时间戳,避免时区或时间计算错误。 - 编写原生Android测试代码,直接调用
setExactAndAllowWhileIdle()触发通知,对比RN版本的结果,确认是否是封装层导致的问题。
- 检查
内容的提问来源于stack exchange,提问作者james_ma
相关产品推荐
相关产品推荐

