Android onMessageReceived检查通知payload及关后台日志不显示问题求解
调试应用关闭时RemoteMessage内容的方法
- 持久化日志到本地存储:在
onMessageReceived方法最开头,把RemoteMessage的data、notification全部序列化为JSON字符串,写入应用内部存储的日志文件中,应用重新打开后可以读取该文件查看历史收到的推送内容。示例逻辑:
val payload = Gson().toJson(mapOf( "data" to message.data, "notification" to mapOf( "title" to message.notification?.title, "body" to message.notification?.body, "clickAction" to message.notification?.clickAction ) )) // 写入内部存储不需要额外权限 openFileOutput("fcm_payloads.log", MODE_APPEND).bufferedWriter().use { it.appendLine("${System.currentTimeMillis()}: $payload") }
- 用adb持久化logcat输出:连接测试设备后执行命令
adb logcat -s YourLogTag -f /sdcard/fcm_logs.txt,日志会持续写入手机存储,即使应用进程被杀也会继续记录,测试完成后执行adb pull /sdcard/fcm_logs.txt即可导出到电脑查看。 - 自定义事件上报:把收到的payload作为参数上报到埋点平台,平台会在应用下一次启动时把缓存的事件上报,你可以在后台直接查看payload内容。
实现该功能的注意事项
- 现有代码逻辑bug修复:你当前
onMessageReceived中url不为空的分支只创建了Intent,没有把它封装为PendingIntent绑定到通知,也没有执行跳转逻辑,该分支功能完全无法生效,需要补充对应通知构建逻辑。 - 区分FCM消息类型:
- 仅携带
data字段的数据消息,无论应用在前台/后台/被杀,都会触发onMessageReceived回调 - 携带
notification字段的通知消息,应用在后台/被杀时不会触发onMessageReceived,直接由系统弹出通知,点击后payload会传递到启动Activity的intent中,你需要在首页的onCreate、onNewIntent中补充从intent.extras取参数的逻辑,否则这类通知点击后无法跳转对应Fragment。
- 仅携带
- PendingIntent兼容性适配:Android 12及以上系统要求
PendingIntent必须明确指定可变性,你当前只使用了FLAG_UPDATE_CURRENT,在Android 12+上会触发崩溃,需要修改为:// 如果不需要修改Intent内容用FLAG_IMMUTABLE,需要修改的话用FLAG_MUTABLE val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE else PendingIntent.FLAG_UPDATE_CURRENT PendingIntent.getActivity(this, requestCode, intent, flag) - 避免通知被覆盖:当前你调用
notificationManager.notify(0, ...)固定用id 0,所有通知都会互相覆盖,同时PendingIntent的requestCode也固定为0,会导致多条通知的点击参数被覆盖为最后一条的内容。建议用campaignId的哈希值作为通知id和PendingIntent的requestCode。 - 空Intent兜底逻辑:你的
getNotificationIntent方法中,如果cloud8Type和notificationType都没有匹配到分支,会返回空的Intent,点击这类通知会触发崩溃,需要补充默认跳转到应用首页的逻辑。 - 国内厂商适配:小米、华为、OPPO、vivo等国产ROM默认禁止应用被杀后自启动,FCM推送无法到达,需要引导用户开启应用的自启动权限、将应用加入后台耗电白名单,也可以接入对应厂商推送通道提高送达率。
- 通知图标适配:Android 5.0及以上要求通知小图标必须为带透明通道的矢量素材,否则在系统通知栏会显示为白色方块,需要确认
R.drawable.ic_notification符合适配要求。
内容的提问来源于stack exchange,提问作者andrewedgar
相关产品推荐
相关产品推荐

