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
相关产品推荐
相关产品推荐

