文档管理中心

获取消息数据

场景介绍

如果您希望获取通知栏或者透传消息的数据,需要实现onMessageReceived回调方法,收到消息的后续行为由应用处理。

您需要在“AndroidManifest.xml”文件的“application”标签下注册您自己的service,且只继承HmsMessageService类并实现其中的方法,此处以DemoHmsMessageService类为例(类名由您自定义)。

收起
自动换行
深色代码主题
复制
  1. <manifest ...>
  2. ...
  3. <application ...>
  4. <service android:name=".DemoHmsMessageService" android:exported="false">
  5. <intent-filter>
  6. <action android:name="com.huawei.push.action.MESSAGING_EVENT"/>
  7. </intent-filter>
  8. </service>
  9. </application>
  10. ...
  11. <queries>
  12. <intent>
  13. <action android:name="com.huawei.hms.core.aidlservice" />
  14. </intent>
  15. </queries>
  16. ...
  17. </manifest>
说明
  • exported属性需要设置为false,限制其他应用的组件唤醒该service。
  • Push SDK版本从6.1.0.300开始预置<queries>元素,建议您集成最新版本Push SDK。
  • “Android 11”更改了应用查询用户在设备上已安装的其他应用以及与之交互的方式。您应用的“targetSdkVersion”是30或者更高版本时,需要在“AndroidManifest.xml”“manifest”内添加<queries>元素,使应用可以访问HMS Core(APK),设置<queries>元素对开发工具要求如下:
    • Android Studio 3.6.1或更高版本。
    • Android Gradle插件为3.5.4或更高版本。

获取通知栏消息数据

应用在前台时,您需要设置“message.android.notification.foreground_show”值为“false”,使用REST API发送通知栏消息,实现onMessageReceived回调方法即可获取消息的数据。

字段值说明:

  • 值为“false”,表示应用在前台时不再由NC展示通知栏消息,通知栏消息的全部内容将会通过onMessageReceived(RemoteMessage message)方法传递给应用,您就可以通过RemoteMessage类提供的方法获取对应的消息内容。这种情况下,推送服务不会校验消息字段的合法性。
  • 值为“true”或者不填写,表示应用在前台时仍旧由NC展示通知栏消息,无法获取消息数据。
说明
  • 该功能要求EMUI 9.1.0以上,Push SDK 4.0以上。
  • 通知栏消息通过onMessageReceived回调后getMessageId获取到的是实际的通知栏消息的ID。

示例报文:

收起
自动换行
深色代码主题
复制
  1. {
  2. "message": {
  3. "notification": {
  4. "title": "message title",
  5. "body": "message body"
  6. },
  7. "android": {
  8. "notification": {
  9. "foreground_show": false,
  10. "click_action": {
  11. "type": 3
  12. }
  13. }
  14. },
  15. "token": ["pushtoken1"]
  16. }
  17. }

获取透传消息数据

无论应用在前台或者后台,当您在DemoHmsMessageService类中重写如下onMessageReceived方法后,只要您发送透传消息,都会获得透传消息的内容。

Java
Kotlin
收起
自动换行
深色代码主题
复制
  1. @Override
  2. public void onMessageReceived(RemoteMessage message) {
  3. Log.i(TAG, "onMessageReceived is called");
  4. // 判断消息是否为空
  5. if (message == null) {
  6. Log.e(TAG, "Received message entity is null!");
  7. return;
  8. }
  9. // 获取消息内容
  10. Log.i(TAG, "get Data: " + message.getData()
  11. + "\n getFrom: " + message.getFrom()
  12. + "\n getTo: " + message.getTo()
  13. + "\n getMessageId: " + message.getMessageId()
  14. + "\n getSentTime: " + message.getSentTime()
  15. + "\n getDataMap: " + message.getDataOfMap()
  16. + "\n getMessageType: " + message.getMessageType()
  17. + "\n getTtl: " + message.getTtl());
  18. Boolean judgeWhetherIn10s = false;
  19. // 如果消息在10秒内没有处理,需要您自己创建新任务处理
  20. if (judgeWhetherIn10s) {
  21. startWorkManagerJob(message);
  22. } else {
  23. // 10秒内处理消息
  24. processWithin10s(message);
  25. }
  26. }
  27. private void startWorkManagerJob(RemoteMessage message) {
  28. Log.d(TAG, "Start new job processing.");
  29. }
  30. private void processWithin10s(RemoteMessage message) {
  31. Log.d(TAG, "Processing now.");
  32. }
收起
自动换行
深色代码主题
复制
  1. override fun onMessageReceived(message: RemoteMessage?) {
  2. Log.i(TAG, "onMessageReceived is called")
  3. // 判断消息是否为空
  4. if (message == null)
  5. {
  6. Log.e(TAG, "Received message entity is null!")
  7. return
  8. }
  9. // 获取消息内容
  10. Log.i(TAG, """getData: ${message.data}
  11. getFrom: ${message.from}
  12. getTo: ${message.to}
  13. getMessageId: ${message.messageId}
  14. getSentTime: ${message.sentTime}
  15. getDataMap: ${message.dataOfMap}
  16. getMessageType: ${message.messageType}
  17. getTtl: ${message.ttl}""".trimIndent())
  18. val judgeWhetherIn10s = false
  19. // 如果消息在10秒内没有处理,需要您自己创建新任务处理
  20. if (judgeWhetherIn10s) {
  21. startWorkManagerJob(message)
  22. } else {
  23. // 10秒内处理消息
  24. processWithin10s(message)
  25. }
  26. }
  27. private fun startWorkManagerJob(message: RemoteMessage?) {
  28. Log.d(TAG, "Start new Job processing.")
  29. }
  30. private fun processWithin10s(message: RemoteMessage?) {
  31. Log.d(TAG, "Processing now.")
  32. }
在 指南 中进行搜索
请输入您想要搜索的关键词