Android 8.0(Oreo)及更高版本通知无法弹出,代码哪里存在问题?
问题1:通知通道创建存在低级代码错误
你的App.java中创建通知通道的代码存在严重的对象调用错误:
- 创建channel2(ALARMS_CHANNEL)、channel3(SCHEDULED_TIMETABLE_CHANNEL)、channel4(TIMETABLE_CHANNEL)后,全部错误调用了
channel1.setLightColor()修改第一个通道的属性,根本没有对对应通道做任何自定义配置 - 该问题会导致除第一个和最后一个通道外,其余三个通道的属性均为系统默认配置,尤其
SCHEDULED_TIMETABLE_CHANNEL创建后无任何自定义设置,是该通道通知无法发出的核心原因
修复方案:将对应set方法的调用对象改为对应通道即可:
// 原来的错误写法 NotificationChannel channel2 = new NotificationChannel(ALARMS_CHANNEL_ID, ALARMS_CHANNEL, NotificationManager.IMPORTANCE_HIGH); channel1.setLightColor(ContextCompat.getColor(this, android.R.color.holo_orange_light)); // 改为 channel2.setLightColor(ContextCompat.getColor(this, android.R.color.holo_orange_light)); // 同理channel3、channel4都改为对应对象调用
问题2:ALARMS_CHANNEL无法弹出横幅通知的原因
- 你发送通知时调用了
setSilent(true),该参数会强制覆盖通知通道的优先级、声音、震动配置,即使通道设为IMPORTANCE_HIGH也不会弹出横幅 - 通知通道一旦创建成功,后续修改代码里的通道配置不会生效,需要卸载应用重装、或者修改通道ID重新创建才会更新配置,之前测试时可能因为通道已经被创建为低优先级/无弹窗权限,导致修改代码无效
- 检查系统设置中应用的通知权限,是否手动关闭了对应通道的横幅/悬浮通知权限
问题3:SCHEDULED_TIMETABLE_CHANNEL通知无法发出的其他原因
- 你调用
manager.notify()时使用了负数ID-299,部分国产Android系统对负数通知ID存在兼容问题,建议改为正整数ID - Android 13(API 33)及以上系统需要申请
POST_NOTIFICATIONS动态权限,你没有在AndroidManifest中声明该权限,也没有做动态申请逻辑,会导致系统直接拦截通知 - 发送通知前可以添加权限校验,提前判断通知是否能发出:
if (!NotificationManagerCompat.from(context).areNotificationsEnabled()) { // 跳转系统设置开启通知权限 return; }
其他隐患
你定义的作业通道ID常量ASIGNMENT_CHANNEL_ID拼写错误,少了一个S(正确拼写为ASSIGNMENT),如果后续调用时写了正确拼写会找不到对应通道,建议修正常量拼写。
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

