目录

获取消息数据

场景介绍

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

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

<manifest ...>
    ...
    <application ...>
        <service android:name=".DemoHmsMessageService" android:exported="false">
            <intent-filter>
                <action android:name="com.huawei.push.action.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
    </application>
    ...
    <queries>
        <intent>
            <action android:name="com.huawei.hms.core.aidlservice" />
        </intent>
    </queries>
    ...
</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回调方法即可获取消息的数据。

字段值说明:

  • 该功能要求EMUI 9.1.0以上,Push SDK 4.0以上。
  • 通知栏消息通过onMessageReceived回调后getMessageId获取到的是实际的通知栏消息的ID。

示例报文:

{
    "message": {
        "notification": {
            "title": "message title",
            "body": "message body"
        },
        "android": {
            "notification": {
                "foreground_show": false,
                "click_action": {
                    "type": 3
                }
            }
        },
        "token": ["pushtoken1"]
    }
}

获取透传消息数据

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

“Java”
@Override
public void onMessageReceived(RemoteMessage message) {
    Log.i(TAG, "onMessageReceived is called");

    // 判断消息是否为空
    if (message == null) {
        Log.e(TAG, "Received message entity is null!");
        return;
    }

    // 获取消息内容
    Log.i(TAG, "get Data: " + message.getData()
            + "\n getFrom: " + message.getFrom()
            + "\n getTo: " + message.getTo()
            + "\n getMessageId: " + message.getMessageId()
            + "\n getSentTime: " + message.getSentTime()
            + "\n getDataMap: " + message.getDataOfMap()
            + "\n getMessageType: " + message.getMessageType()
            + "\n getTtl: " + message.getTtl());

    Boolean judgeWhetherIn10s = false;
    // 如果消息在10秒内没有处理,需要您自己创建新任务处理
    if (judgeWhetherIn10s) {
        startWorkManagerJob(message);
    } else {
        // 10秒内处理消息
        processWithin10s(message);
    }
}
private void startWorkManagerJob(RemoteMessage message) {
    Log.d(TAG, "Start new job processing.");
}
private void processWithin10s(RemoteMessage message) {
    Log.d(TAG, "Processing now.");
}
“Kotlin”
override fun onMessageReceived(message: RemoteMessage?) {
    Log.i(TAG, "onMessageReceived is called")
    
    // 判断消息是否为空
    if (message == null)
    {        
        Log.e(TAG, "Received message entity is null!")
        return    
    }    
    
    // 获取消息内容
    Log.i(TAG, """getData: ${message.data}        
        getFrom: ${message.from}        
        getTo: ${message.to}        
        getMessageId: ${message.messageId}
        getSentTime: ${message.sentTime}           
        getDataMap: ${message.dataOfMap}
        getMessageType: ${message.messageType}   
        getTtl: ${message.ttl}""".trimIndent())

    val judgeWhetherIn10s = false   
    // 如果消息在10秒内没有处理,需要您自己创建新任务处理    
    if (judgeWhetherIn10s) {        
        startWorkManagerJob(message)    
    } else {     
        // 10秒内处理消息               
        processWithin10s(message)    
    }
}
private fun startWorkManagerJob(message: RemoteMessage?) {    
    Log.d(TAG, "Start new Job processing.")
}
private fun processWithin10s(message: RemoteMessage?) {    
    Log.d(TAG, "Processing now.")
}