小编典典

Firebase中应用程序在后台时如何处理通知

all

这是我的清单:

<service android:name=".fcm.PshycoFirebaseMessagingServices">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

<service android:name=".fcm.PshycoFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

当应用程序在后台并收到通知时,默认通知会出现并且不会运行我的onMessageReceived.

这是我的onMessageReceived代码。如果我的应用程序在前台运行,而不是在后台运行,则会调用此方法。当应用程序也在后台时,如何运行此代码?

// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
    data = remoteMessage.getData();
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();
    String imageUrl = (String) data.get("image");
    String action = (String) data.get("action");
    Log.i(TAG, "onMessageReceived: title : "+title);
    Log.i(TAG, "onMessageReceived: message : "+message);
    Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
    Log.i(TAG, "onMessageReceived: action : "+action);

    if (imageUrl == null) {
        sendNotification(title,message,action);
    } else {
        new BigPictureNotification(this,title,message,imageUrl,action);
    }
}
// [END receive_message]

阅读 216

收藏
2022-03-11

共1个答案

小编典典

1. 为什么会这样?

FCM(Firebase Cloud Messaging)中有两种类型的消息:

  1. 显示消息*onMessageReceived():这些消息仅在您的应用处于 前台 时触发回调 *
  2. 数据消息:* 即使 您的应用程序处于 前台/后台/ 已终止,这些消息也会触发onMessageReceived()回调 ***

注意: Firebase 团队尚未开发可发送data-messages到您的设备的 UI。您应该使用您的服务器发送此类型!

2. 怎么做?

为此,您必须向POST以下 URL 执行请求:

POST
https://fcm.googleapis.com/fcm/send

标头

  • 键: Content-Type值: application/json
  • 键: Authorization值: key=<your-server-key>

正文使用主题

{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

或者,如果您想将其发送到特定设备

{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}

注意: 确保您 没有添加 JSON 密钥notification
注意: 要获取服务器密钥,您可以在 firebase 控制台中找到它:Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3. 推送通知消息如何处理?

这是您处理收到的消息的方式:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}
2022-03-11