首页 > 解决方案 > 将 Firebase 云消息发送到关闭的应用程序不起作用

问题描述

我正在尝试使用 Firebase Cloud Messaging 做一些事情,我明白了,我可以使用 FCM-Console 通过 FCM 令牌向设备发送消息。我认为即使您的应用程序没有完全运行,您也可以收到这些消息。但是当我的应用程序在后台运行时,我只能收到这些消息。

我现在的问题是,当您的应用程序未运行时是否可以接收消息,如果是,我该如何完成?

这是我添加到清单的内容:

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/app_icon" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />


    <service
        android:name=".MyFirebaseInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name=".MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

在课堂上:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

    //if the message contains data payload
    //It is a map of custom keyvalues
    //we can read it easily
    if(remoteMessage.getData().size() > 0){
        //handle the data message here
    }

    //getting the title and the body
    String title = remoteMessage.getNotification().getTitle();
    String body = remoteMessage.getNotification().getBody();
}
}


public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService{
//private Socket mSocket;

@Override
public void onTokenRefresh() {
    super.onTokenRefresh();

    String token = FirebaseInstanceId.getInstance().getToken();

    Log.d("MyRefreshedToken", token);

    storeToken(token);
}

private void storeToken(String token) {
    SharedPrefManager.getInstance(getApplicationContext()).saveDeviceToken(token);
}
}

标签: androidfirebase-cloud-messaging

解决方案


是的,当您的应用程序未运行时,可以使用您的 onMessageReceived 方法接收消息。为此,您需要发送数据消息,也称为静默推送消息。这意味着您需要省略通知标题和正文属性,并且只发送带有数据属性的信息。

前任。

{
  "message": {
    "token":"78yadsbjbasjkdjbkasbdjkbak...",
    "data": {
      "Topic" : "Data message",
      "Content" : "This message should be handled by onMessageReceived regardless if the app is running or not.",
    }
  }
}

有关更多信息,请查看 Firebase 文档中的以下页面:


推荐阅读