Android无法根据FCM tag参数选择对应NotificationCompat.Builder发送通知
FCM通知分支逻辑失效修复方案
核心错误原因
- 字符串比较逻辑错误:Java中
==比较的是两个字符串对象的内存引用地址,不是内容值,你写的tag=="View Message"判断永远不会成立,这是逻辑不执行的核心原因。 - 重复构建Notification对象:你在if块里先调用一次
build()生成noti对象设置flags,实际调用notify()时又重新调用了一次build()生成新对象,之前设置的flags完全没有生效。 - 通知ID冲突:两类通知如果复用同一个
notification_id,后发送的通知会直接覆盖之前的通知,无法实现两类通知共存、长留存的需求。 - 额外潜在问题:全屏意图通知需要匹配对应等级的通知渠道、声明必要权限,否则即使逻辑走通也无法正常展示。
修复后实现代码
1. 修正分支判断与通知构建逻辑
// 从FCM消息体中取出tag字段,默认值设为空字符串避免空指针 String tag = remoteMessage.getData().get("tag") == null ? "" : remoteMessage.getData().get("tag"); Notification targetNotification; // 字符串内容比较用equals方法,常量写在前面规避空指针风险 if ("View Message".equals(tag)) { targetNotification = notificationBuilder.build(); } else if ("Start".equals(tag)) { targetNotification = notificationBuilder1.build(); } else { // 兜底逻辑:tag不匹配时默认使用无全屏意图的通知模板 targetNotification = notificationBuilder1.build(); } // 统一给最终要发送的通知对象设置flags,不需要重复build targetNotification.flags = Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.FLAG_AUTO_CANCEL; // 不同类型通知分配独立ID段,避免互相覆盖 int finalNotifyId; if ("View Message".equals(tag)) { // 带全屏意图的长留存通知使用独立ID区间,比如给基础ID加固定偏移 finalNotifyId = notification_id + 20000; } else { finalNotifyId = notification_id; } // 发送通知 notificationManager.notify(finalNotifyId, targetNotification);
2. 检查通知渠道配置(Android 8.0+必做)
通知渠道的优先级高于Builder内的配置,带全屏意图的通知必须绑定高重要性渠道,渠道创建代码参考:
// 只需要在应用首次启动、渠道未创建时执行一次即可 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel callChannel = new NotificationChannel( MainActivity.asw_fcm_channel, "呼叫通知", NotificationManager.IMPORTANCE_HIGH // 必须设置为高重要性 ); callChannel.setDescription("用于展示应用内呼叫、高优先级提醒通知"); callChannel.enableVibration(true); callChannel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PUBLIC); notificationManager.createNotificationChannel(callChannel); }
3. 声明全屏通知权限(Android 12+必做)
在AndroidManifest.xml中添加全屏通知需要的权限,否则setFullScreenIntent配置不生效:
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
冗余配置优化建议
你在两个Builder中同时设置了.setDefaults(Notification.DEFAULT_ALL)和单独的sound、vibrate配置,属于重复配置,可以删掉.setDefaults(Notification.DEFAULT_ALL)这一行,避免自定义铃声、振动模式被默认配置覆盖。
内容的提问来源于stack exchange,提问作者Ahamed
相关产品推荐
相关产品推荐

