Android AlarmManager定时通知不生效 无代码报错问题咨询
问题描述
应用可正常启动运行,但无法按设定时间弹出通知,重启应用后故障依旧,需求为应用启动后可在指定时间点正常触发通知。
故障原因与修复方案
代码存在4个核心问题,按以下要求修改后即可正常触发通知:
- 核心错误:
PendingIntent类型调用错误。当前使用的PendingIntent.getActivity()是用于跳转Activity的方法,而你需要触发BroadcastReceiver,必须替换为PendingIntent.getBroadcast(),否则AlarmManager到时间点根本不会唤起你的广播接收器。
修改NotifyUsers()方法中的对应代码,同时删除给Intent添加的Activity专属启动Flag:// 删掉这行无用的Activity启动Flag // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getBroadcast(index.this, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); - 权限缺失:Android 13(API 33)及以上版本必须申请
POST_NOTIFICATIONS运行时权限,否则即使通知通道创建成功也无法弹出通知。
首先在AndroidManifest中添加权限声明:
之后在Activity的<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />onCreate生命周期中,调用NotifyUsers()前添加运行时权限申请逻辑,用户授权后才可正常发送通知。 - 权限名书写错误:Manifest中配置的设置闹钟权限路径错误,你写的
android.permission.alarm.permission.SET_ALARM不存在,正确权限为:
如果targetSdk版本为31及以上,使用精确闹钟还需要额外添加<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />SCHEDULE_EXACT_ALARM权限,同时需要引导用户开启应用的闹钟设置权限,否则闹钟触发可能被系统拦截。 - 闹钟方法选择错误:Android 6.0及以上版本的Doze省电模式会延迟普通
set()方法触发的RTC_WAKEUP类型闹钟,如果需要保证到点准时触发,需要替换为精确闹钟方法,避免系统为省电将闹钟推迟到维护窗口执行:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, currentTime + tenSeconds, pendingIntent); } else { alarmManager.setExact(AlarmManager.RTC_WAKEUP, currentTime + tenSeconds, pendingIntent); }
额外检查项
- 确认测试设备没有手动关闭应用的通知权限,部分国产定制ROM还需要给应用开启自启动、后台无限制运行权限,否则应用进程被杀后广播接收器无法收到闹钟触发信号。
- 确认
R.drawable.icon_notif资源存在且符合规范,通知小图标必须使用透明背景的PNG格式,否则通知可能显示异常甚至无法弹出。
内容的提问来源于stack exchange,提问作者Errie
相关产品推荐
相关产品推荐

