You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Huawei Push Kit通知消息无法触发onMessageReceived问题咨询

问题:含Notification字段的华为Push消息无法触发onMessageReceived

我按照华为官方文档开发,发送包含notification和android字段的Payload(已设置foreground_show: false):

{
    "validate_only":false,
    "message": {
        "notification": {
            "title": "message title",
            "body": "message body"
        },
        "android": {
            "notification": {
                "foreground_show": false,
                "click_action": {
                    "type": 3
                }
            }
        },
        "data":"{'param2':'value1','param3':'value2'}",
        "token": [
            "ABW18Q4Rw5CAB68f9yS_1f859k0s-t3G1aIZheq5l6TedFj_Iold4I6M2EK-pwPTzt6HXxL_"
        ]
    }
}

结果消息未触发onMessageReceived方法解析,而是由华为通知中心自动创建了通知。但仅发送含data字段的Payload时:

{
    "validate_only": false,
    "message": { 
        "data": "{'param1':'value1','param2':'value2'}",
        "token": [
            "ABW18Q4Rw5CAB68f9yS_1f859k0s-t3G1aIZheq5l6TedFj_Iold4I6M2EK-pwPTzt6HXxL_"
        ]
    }
}

可以成功触发onMessageReceived。我已经重写了该方法,代码如下:

class CustomPushService : HmsMessageService() {
    private val TAG = "PushTokenLog"

    override fun onNewToken(token: String?, bundle: Bundle?) {
        super.onNewToken(token, bundle)
        Log.d(TAG, "receive token:$token")
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        Log.d(TAG, "onMessageReceived")
        Log.d(TAG, "onMessageReceived:title:${remoteMessage?.notification?.title}")
        super.onMessageReceived(remoteMessage)

    }
}

请问能否发送上述完整Payload并触发onMessageReceived处理消息?我的操作是否有误?


解答

问题原因

你发送的是通知栏消息(Notification Message),这类消息默认会由华为Push SDK直接交由系统通知栏处理,不会传递到onMessageReceived方法——哪怕你设置了foreground_show: false,这个参数仅控制App处于前台时是否显示通知,不改变消息的核心分发逻辑。

而仅含data字段的是数据消息(Data Message),这类消息会直接传递到onMessageReceived,完全由开发者自行处理。

实现方案:让含通知内容的消息触发onMessageReceived

要实现你的需求,需要调整Payload结构:将通知栏相关配置全部放到android字段下的notification中,移除根节点的notification字段,同时保留foreground_show: false配置。调整后的Payload示例:

{
    "validate_only":false,
    "message": {
        "android": {
            "notification": {
                "title": "message title",
                "body": "message body",
                "foreground_show": false,
                "click_action": {
                    "type": 3
                }
            }
        },
        "data":"{'param2':'value1','param3':'value2'}",
        "token": [
            "ABW18Q4Rw5CAB68f9yS_1f859k0s-t3G1aIZheq5l6TedFj_Iold4I6M2EK-pwPTzt6HXxL_"
        ]
    }
}

这样配置后,消息会被识别为数据+本地通知的组合消息:

  • 消息会传递到onMessageReceived方法,你可以在方法内获取data和通知的标题、内容等信息
  • 因为设置了foreground_show: false,App前台时不会自动弹出通知;后台时会由SDK自动创建通知(如果需要完全自定义通知样式和行为,你可以在onMessageReceived中自行构建通知,不依赖SDK的自动处理)

额外检查项

  • 确保CustomPushService已在AndroidManifest.xml中正确注册,配置了对应的intent-filter和权限
  • 确认华为Push SDK使用的是最新稳定版,避免旧版本的逻辑差异

内容的提问来源于stack exchange,提问作者faryz ryz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:01:24