300

我正在使用 Firebase 并测试在应用程序处于后台时从我的服务器向我的应用程序发送通知。通知发送成功,它甚至出现在设备的通知中心,但是当通知出现或者即使我点击它,我的 FCMessagingService 中的 onMessageReceived 方法也永远不会被调用。

当我在我的应用程序处于前台时对此进行测试时,调用了 onMessageReceived 方法并且一切正常。当应用程序在后台运行时会出现问题。

这是预期的行为,还是有办法解决这个问题?

这是我的 FBMessagingService:

import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class FBMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.i("PVL", "MESSAGE RECEIVED!!");
        if (remoteMessage.getNotification().getBody() != null) {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
        } else {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
        }
    }
}
4

28 回答 28

186

这是按预期工作的,只有当您的应用程序处于前台时,通知消息才会传递到您的 onMessageReceived 回调。如果您的应用程序在后台或已关闭,则通知中心会显示一条通知消息,并且该消息中的任何数据都会传递给由于用户点击通知而启动的意图。

您可以指定 click_action 来指示用户点击通知时应启动的意图。如果未指定 click_action,则使用主要活动。

当意图启动时,您可以使用

getIntent().getExtras();

检索一个集合,该集合将包括与通知消息一起发送的任何数据。

有关通知消息的更多信息,请参阅文档

于 2016-05-23T16:11:12.527 回答
163

notification从您的服务器请求中完全删除字段。data发送并处理它,onMessageReceived()否则onMessageReceived()当应用程序处于后台或被杀死时,您将不会被触发。

不要忘记"priority": "high"在您的通知请求中包含字段。根据文档:数据消息以正常优先级发送,因此它们不会立即到达;这也可能是问题所在。

这是我从服务器发送的内容

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......",
  "priority": "high"
}

所以你可以onMessageReceived(RemoteMessage message)像这样接收你的数据....假设我必须得到 id

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }
于 2016-10-17T10:14:35.810 回答
67

这个方法handleIntent()已经被贬值了,所以处理一个通知可以如下完成:

  1. 前景状态:单击通知将转到您在以编程方式创建通知时提供的待处理 Intent 活动,因为它通常使用通知的数据有效负载创建。

  2. Background/Killed State - 在这里,系统本身会根据通知负载创建一个通知,单击该通知将带您进入应用程序的启动器活动,您可以在其中轻松地以任何生命周期方法获取 Intent 数据。

于 2017-05-09T12:01:11.277 回答
39

这是有关 firebase 消息的更清晰的概念。我是从他们的支持团队那里找到的。

Firebase 具有三种消息类型

通知消息:通知消息在后台或前台工作。当应用程序处于后台时,通知消息将传递到系统托盘。如果应用程序在前台,则消息由回调onMessageReceived()didReceiveRemoteNotification回调处理。这些本质上就是所谓的显示消息。

数据消息:在Android平台上,数据消息可以在后台和前台工作。数据消息将由 onMessageReceived() 处理。这里有一个特定于平台的说明:在 Android 上,可以在用于启动您的活动的 Intent 中检索数据有效负载。详细地说,如果你有,你可以通过from only"click_action":"launch_Activity_1"检索这个意图。getIntent()Activity_1

带有通知和数据负载的消息:在后台时,应用程序在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。在前台时,您的应用会收到一个消息对象,其中包含两个可用的有效负载。其次,click_action 参数通常用于通知负载而不是数据负载。如果在数据负载中使用,此参数将被视为自定义键值对,因此您需要实现自定义逻辑以使其按预期工作。

另外,我建议您使用 onMessageReceived 方法(请参阅数据消息)来提取数据包。根据您的逻辑,我检查了 bundle 对象并没有找到预期的数据内容。这是对类似案例的参考,可能会提供更清晰的信息。

从服务器端,firebase 通知应采用以下格式

服务器端应该发送“通知”对象。我TargetActivity没有使用getIntent().

正确的消息格式如下:

{
 "data": {
  "body": "here is body",
  "title": "Title"
 },
"notification": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

这是有关 firebase 消息的更清晰的概念。我是从他们的支持团队那里找到的。

有关更多信息,请访问我的这个线程这个线程

于 2016-08-27T09:20:51.863 回答
31

我有同样的问题。使用“数据消息”而不是“通知”更容易。数据消息总是加载 onMessageReceived 类。

在该类中,您可以使用通知构建器制作自己的通知。

例子:

 @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        sendNotification(remoteMessage.getData().get("title"),remoteMessage.getData().get("body"));
    }

    private void sendNotification(String messageTitle,String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0 /* request code */, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        long[] pattern = {500,500,500,500,500};

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_name)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setVibrate(pattern)
                .setLights(Color.BLUE,1,1)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
于 2016-05-26T21:29:20.637 回答
28

根据 Firebase Cloud Messaging 文档 - 如果 Activity 在前台,则将调用 onMessageReceived。如果 Activity 处于后台或关闭状态,则通知中心会显示应用启动器活动的通知消息。如果您的应用程序在后台,您可以通过单击通知来调用您的自定义活动,方法是调用 rest 服务 api 进行 firebase 消息传递,如下所示:

网址 - https://fcm.googleapis.com/fcm/send

方法类型 - POST

Header- Content-Type:application/json
Authorization:key=your api key

车身/有效载荷:

{ "notification": {
    "title": "Your Title",
    "text": "Your Text",
     "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
  },
    "data": {
    "keyname": "any value " //you can get this data as extras in your activity and this data is optional
    },
  "to" : "to_id(firebase refreshedToken)"
} 

在您的应用程序中使用此功能,您可以在要调用的活动中添加以下代码:

<intent-filter>
                <action android:name="OPEN_ACTIVITY_1" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
于 2016-06-02T18:01:40.783 回答
18

onMessageReceived(RemoteMessage remoteMessage)方法基于以下情况调用。

  • 带有通知数据块的FCM 响应:
{
  
"to": "device token list",
  "notification": {
    "body": "Body of Your Notification",
    "title": "Title of Your Notification"
  },
  "data": {
    "body": "Body of Your Notification in Data",
    "title": "Title of Your Notification in Title",
    "key_1": "Value for key_1",
    "image_url": "www.abc.com/xyz.jpeg",
    "key_2": "Value for key_2"
  }
}
  1. 前台应用:

onMessageReceived(RemoteMessage remoteMessage)调用,在通知栏中显示 LargeIcon 和 BigPicture。我们可以从 通知数据块中读取内容

  1. 后台应用:

onMessageReceived(RemoteMessage remoteMessage)未调用,系统托盘将接收消息并从通知块读取正文和标题,并在通知栏中显示默认消息和标题。

  • FCM 响应仅使用数据块:

在这种情况下,从 json中删除通知块

{
  
"to": "device token list",
  "data": {
    "body": "Body of Your Notification in Data",
    "title": "Title of Your Notification in Title",
    "key_1": "Value for key_1",
    "image_url": "www.abc.com/xyz.jpeg",
    "key_2": "Value for key_2"
  }
}

调用 onMessageReceived() 的解决方案

  1. 前台应用:

onMessageReceived(RemoteMessage remoteMessage)调用,在通知栏中显示 LargeIcon 和 BigPicture。我们可以从 通知数据块中读取内容

  1. 后台应用:

onMessageReceived(RemoteMessage remoteMessage)调用,系统托盘将不会收到消息,因为通知键不在响应中。在通知栏中显示 LargeIcon 和 BigPicture

代码

 private void sendNotification(Bitmap bitmap,  String title, String 
    message, PendingIntent resultPendingIntent) {

    NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
    style.bigPicture(bitmap);

    Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = mContext.getString(R.string.default_notification_channel_id);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "channel_name", NotificationManager.IMPORTANCE_HIGH);

        notificationManager.createNotificationChannel(notificationChannel);
    }
    Bitmap iconLarge = BitmapFactory.decodeResource(mContext.getResources(),
            R.drawable.mdmlogo);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.drawable.mdmlogo)
            .setContentTitle(title)
            .setAutoCancel(true)
            .setSound(defaultSound)
            .setContentText(message)
            .setContentIntent(resultPendingIntent)
            .setStyle(style)
            .setLargeIcon(iconLarge)
            .setWhen(System.currentTimeMillis())
            .setPriority(Notification.PRIORITY_MAX)
            .setChannelId(NOTIFICATION_CHANNEL_ID);


    notificationManager.notify(1, notificationBuilder.build());


}

参考链接:

https://firebase.google.com/docs/cloud-messaging/android/receive

于 2019-06-19T05:05:33.913 回答
15

如果应用程序处于后台模式或处于非活动状态(已终止),并且您单击Notification,您应该检查 LaunchScreen 中的有效负载(在我的情况下,启动屏幕是 MainActivity.java)。

所以在MainActivity.java onCreate检查Extras

    if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Log.d("MainActivity: ", "Key: " + key + " Value: " + value);
        }
    }
于 2017-01-19T10:03:57.797 回答
13

我遇到了同样的问题。如果应用程序是前台 - 它会触发我的后台服务,我可以在其中根据通知类型更新我的数据库。但是,应用程序会进入后台 - 默认通知服务会小心地向用户显示通知。

这是我在后台识别应用程序并触发您的后台服务的解决方案,

public class FirebaseBackgroundService extends WakefulBroadcastReceiver {

  private static final String TAG = "FirebaseService";

  @Override
  public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "I'm in!!!");

    if (intent.getExtras() != null) {
      for (String key : intent.getExtras().keySet()) {
        Object value = intent.getExtras().get(key);
        Log.e("FirebaseDataReceiver", "Key: " + key + " Value: " + value);
        if(key.equalsIgnoreCase("gcm.notification.body") && value != null) {
          Bundle bundle = new Bundle();
          Intent backgroundIntent = new Intent(context, BackgroundSyncJobService.class);
          bundle.putString("push_message", value + "");
          backgroundIntent.putExtras(bundle);
          context.startService(backgroundIntent);
        }
      }
    }
  }
}

在 manifest.xml

<receiver android:exported="true" android:name=".FirebaseBackgroundService" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </receiver>

在最新的 android 8.0 版本中测试了这个解决方案。谢谢

于 2017-11-20T12:35:56.217 回答
10

为我覆盖作品的handleIntent方法。FirebaseMessageService

这里是C# (Xamarin)中的代码

public override void HandleIntent(Intent intent)
{
    try
    {
        if (intent.Extras != null)
        {
            var builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            foreach (string key in intent.Extras.KeySet())
            {
                builder.AddData(key, intent.Extras.Get(key).ToString());
            }

            this.OnMessageReceived(builder.Build());
        }
        else
        {
            base.HandleIntent(intent);
        }
    }
    catch (Exception)
    {
        base.HandleIntent(intent);
    }
}

这就是Java中的代码

public void handleIntent(Intent intent)
{
    try
    {
        if (intent.getExtras() != null)
        {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            for (String key : intent.getExtras().keySet())
            {
                builder.addData(key, intent.getExtras().get(key).toString());
            }

            onMessageReceived(builder.build());
        }
        else
        {
            super.handleIntent(intent);
        }
    }
    catch (Exception e)
    {
        super.handleIntent(intent);
    }
}
于 2017-10-04T09:13:08.060 回答
7

默认情况下,当您的应用程序处于后台并单击通知时,应用程序中的Launcher Activity将启动,如果您的通知中有任何数据部分,您可以在相同的活动中处理它,如下所示,

if(getIntent().getExtras()! = null){
  //do your stuff
}else{
  //do that you normally do
}
于 2016-06-18T05:34:04.183 回答
4

根据 t3h Exi 的解决方案,我想在这里发布干净的代码。只需将其放入 MyFirebaseMessagingService 中,如果应用程序处于后台模式,一切正常。您至少需要编译 com.google.firebase:firebase-messaging:10.2.1

 @Override
public void handleIntent(Intent intent)
{
    try
    {
        if (intent.getExtras() != null)
        {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            for (String key : intent.getExtras().keySet())
            {
                builder.addData(key, intent.getExtras().get(key).toString());
            }



           onMessageReceived(builder.build());
        }
        else
        {
            super.handleIntent(intent);
        }
    }
    catch (Exception e)
    {
        super.handleIntent(intent);
    }
}
于 2017-10-26T12:58:50.363 回答
3

如果应用程序在后台 Fire-base 默认处理通知但是如果我们想要自定义通知,那么我们必须更改我们的服务器端,它负责发送我们的自定义数据(数据有效负载)

从您的服务器请求中完全删除通知有效负载。仅发送数据并在 onMessageReceived() 中处理它,否则当应用程序处于后台或被杀死时,您的 onMessageReceived 将不会被触发。

现在,您的服务器端代码格式看起来像,

{
  "collapse_key": "CHAT_MESSAGE_CONTACT",
  "data": {
    "loc_key": "CHAT_MESSAGE_CONTACT",
    "loc_args": ["John Doe", "Contact Exchange"],
    "text": "John Doe shared a contact in the group Contact Exchange",
    "custom": {
      "chat_id": 241233,
      "msg_id": 123
    },
    "badge": 1,
    "sound": "sound1.mp3",
    "mute": true
  }
}

注意:请参阅上面代码
“文本”中的这一行:数据有效负载中的“John Doe 在组联系人交换中共享了一个联系人”你应该使用“文本”参数而不是“正文”或“消息”参数来进行消息描述或任何你想用文字。

onMessageReceived()

@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.e(TAG, "From: " + remoteMessage.getData().toString());

        if (remoteMessage == null)
            return;

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
           /* Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());*/
            Log.e(TAG, "Data Payload: " + remoteMessage);

            try {

                Map<String, String> params = remoteMessage.getData();
                JSONObject json = new JSONObject(params);
                Log.e("JSON_OBJECT", json.toString());


                Log.e(TAG, "onMessageReceived: " + json.toString());

                handleDataMessage(json);
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
    }
于 2017-12-07T09:51:45.703 回答
3

我有类似的问题。根据本页中提到的答案和参考资料,以下是我如何通过以下方法解决问题的两分钱:

我之前的消息格式如下:

    {
  "notification": {
    "title": "AppName",
    "sound": null,
    "body": "Hey!YouhaveaMessage"
  },
  "data": {
    "param1": null,
    "param2": [
      238
    ],
    "id": 1
  },
  "to": "--the device push token here--"
}

我将消息格式修改为以下:

    {
  "data": {
    "title": "AppName",
    "body": "Hey! You have a message",
    "param1": null,
    "param2": [
      238
    ],
    "id": 1
  },
  "priority": "high",
  "to": " — device push token here — "
}

然后我从“数据”负载本身中检索了标题、正文和所有参数。这解决了问题,即使应用程序在后台,我也可以获得 OnMessageReceived 回调。我写了一篇博客文章解释了同样的问题,你可以在这里找到它。

于 2021-03-20T12:30:46.517 回答
2

只需在 MainActivity 的 onCreate 方法中调用它:

if (getIntent().getExtras() != null) {
           // Call your NotificationActivity here..
            Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
            startActivity(intent);
        }
于 2016-12-07T06:59:14.767 回答
2

我可能在这里回答得很晚,但官方文档有点混乱。

还明确指出有两种类型的通知

  • 通知消息:由 FCM 自动处理
  • 数据消息:由客户端应用程序处理。

毫无疑问,如果服务器发送数据消息,那么 onMessageReceived() 方法肯定会被调用,但在通知消息的情况下,onMessageReceived() 方法只会在应用程序处于前台并且应用程序处于后台时才会被调用正在发送只是空的。

例子:

假设服务器正在发送通知消息类型:

A.在前台的情况下:

  • remoteMessage.data["key"] 将起作用

B.在背景的情况下:-remoteMessage.data["key"] 将返回 null 但在这里如果您在默认活动中使用 getIntent().getExtras().getString("key") 找到相同的意图数据将起作用

C.在 kill 的情况下:-remoteMessage.data["key"] 将返回 null 但在这里如果您在使用 getIntent().getExtras().getString("key") 的默认活动中发现相同的意图数据将起作用

现在,假设服务器正在发送数据消息类型:

D.如果是前景:

  • remoteMessage.data["key"] 将起作用

E.如果有背景:

  • remoteMessage.data["key"] 将起作用

F.遇害:

  • remoteMessage.data["key"] 将起作用

毫无疑问,数据消息将始终调用 onMessageReceived() 方法,但如果通知消息和应用程序处于后台/终止状态,您可以使用B的解决方案。谢谢

我希望它能节省大家的时间。

于 2021-11-04T07:13:45.567 回答
1

我遇到了这个问题(如果应用程序处于后台或关闭状态,应用程序不想在单击通知时打开),并且问题是click_action通知正文中的无效,请尝试将其删除或更改为有效的内容。

于 2016-05-23T14:11:18.887 回答
1

当收到消息并且您的应用程序处于后台时,通知将发送到主要活动的额外意图。

您可以在主活动的 oncreate() 或 onresume() 函数中检查额外值。

您可以检查数据、表格等字段(通知中指定的字段)

例如我使用数据作为密钥发送

public void onResume(){
    super.onResume();
    if (getIntent().getStringExtra("data")!=null){
            fromnotification=true;
            Intent i = new Intent(MainActivity.this, Activity2.class);
            i.putExtra("notification","notification");
            startActivity(i);
        }

}
于 2018-06-28T09:23:39.317 回答
1

值得强调的一点是,即使应用程序在后台,您也必须使用数据消息 -仅数据键- 才能调用 onMessageReceived 处理程序。您的有效负载中不应有任何其他通知消息键,否则如果应用程序在后台,处理程序将不会被触发。

此处提到(但在 FCM 文档中并未如此强调):

https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

使用您的应用服务器和 FCM 服务器 API:仅设置数据密钥。可以是可折叠的或不可折叠的。

于 2016-09-18T10:33:19.660 回答
1

如果您的问题与显示大图像有关,即如果您从 firebase 控制台发送带有图像的推送通知,并且仅当应用程序在前台时才显示图像。此问题的解决方案是发送仅包含数据字段的推送消息。像这样的东西:

{ "data": { "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg", "message": "Firebase Push Message Using API" "AnotherActivity": "True" }, "to" : "device id Or Device token" }
于 2017-02-28T16:29:33.663 回答
1

我正在使用的后端使用的是通知消息而不是数据消息。因此,在阅读了所有答案后,我试图从启动活动的意图包中检索额外内容。但无论我试图从中检索哪些键getIntent().getExtras();,该值始终为空。

但是,我终于找到了一种使用通知消息发送数据并从意图中检索数据的方法。

这里的关键是将数据有效负载添加到通知消息中。

例子:

{
    "data": {
        "message": "message_body",
        "title": "message_title"
    },
    "notification": {
        "body": "test body",
        "title": "test title"
    },
    "to": "E4An.."
}

完成此操作后,您将能够通过以下方式获取您的信息:

intent.getExtras().getString("title") 将会message_title

并且 intent.getExtras().getString("message") 将是message_body

参考

于 2016-11-24T22:27:04.900 回答
1

尝试这个:

public void handleIntent(Intent intent) {
    try {
        if (intent.getExtras() != null) {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");
            for (String key : intent.getExtras().keySet()) {
            builder.addData(key, intent.getExtras().get(key).toString());
        }
            onMessageReceived(builder.build());
        } else {
            super.handleIntent(intent);
        }
    } catch (Exception e) {
        super.handleIntent(intent);
    }
}
于 2018-03-21T05:00:30.457 回答
0

检查@Mahesh Kavathiya 的答案。就我而言,在服务器代码中只有这样:

{
"notification": {
  "body": "here is body",
  "title": "Title",
 },
 "to": "sdfjsdfonsdofoiewj9230idsjkfmnkdsfm"
}

您需要更改为:

{
 "data": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
"notification": {
  "body": "here is body",
  "title": "Title"
 },
 "to": "sdfjsdfonsdofoiewj9230idsjkfmnkdsfm"
}

然后,如果应用程序在后台,默认活动意图额外将获得“数据”

祝你好运!

于 2020-03-20T09:45:19.577 回答
0

我遇到了同样的问题,并对此进行了更多挖掘。当应用程序在后台时,会向系统托盘发送一条通知消息但会向onMessageReceived()
查看https://firebase.google.com/docs/cloud-messaging/downstream#monitor-token-generation_3
https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java

为了确保您发送的消息,文档说,“使用您的应用服务器和 FCM 服务器 API:仅设置数据密钥。可以是可折叠的或不可折叠的。
请参阅https://firebase.google.com/ docs/cloud-messaging/concept-options#notifications_and_data_messages

于 2016-07-19T19:47:21.807 回答
0

有两种类型的消息:通知消息和数据消息。如果您只发送数据消息,则消息字符串中没有通知对象。当您的应用程序在后台时会调用它。

于 2016-08-17T15:18:27.967 回答
-1

你可以在你的主 Activity 中尝试这个,当在后台时

   if (getIntent().getExtras() != null) {
            for (String key : getIntent().getExtras().keySet()) {
                Object value = getIntent().getExtras().get(key);
                Log.d(TAG, "Key: " + key + " Value: " + value);
            }
        }

检查以下项目作为参考

于 2020-07-03T00:22:26.303 回答
-1

Firebase推送通知有两种类型

1- 通知消息(显示消息)-> -- 1.1 如果您选择此变体,如果应用程序处于后台,操作系统将自行创建一个通知,并将在intent. 然后由客户端来处理这些数据。

-- 1.2 如果应用程序在前台,那么它将通过callback-functionin接收通知,并由FirebaseMessagingService客户端来处理它。

2- 数据消息(最多 4k 数据)-> 这些消息用于仅向客户端发送数据(静默),由客户端通过回调函数在后台/前台处理它FirebaseMessagingService

这是根据官方文档:https ://firebase.google.com/docs/cloud-messaging/concept-options

于 2019-02-01T12:27:46.237 回答
-2

只需覆盖 FirebaseMessagingService 的 OnCreate 方法。当您的应用程序在后台时调用它:

public override void OnCreate()
{
    // your code
    base.OnCreate();
}
于 2018-06-01T14:55:29.037 回答