【问题标题】:Firebase save data when app is in background [duplicate]应用程序在后台时Firebase保存数据[重复]
【发布时间】:2017-05-08 18:39:35
【问题描述】:

我有一个从服务器向应用推送通知的示例输出,如下所示:

  {
    "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }

当应用程序在后台时如何将内容存储在数据中,因为onMessageReceived 仅在应用程序在前台时触发。

【问题讨论】:

  • 你收到通知了吗?
  • 您使用的是哪个设备?
  • 是的。我正在收到通知。但是 onMessageReceived 没有被调用。它仅在应用程序处于前台时调用

标签: android firebase firebase-cloud-messaging


【解决方案1】:

我找到了解决方案。从本地服务器发送到firebase服务器时,似乎我必须删除json中的notification部分。如果应用在后台,它会触发onMessageReceived

来源:https://code.google.com/p/android/issues/detail?id=219084

所以我所做的是从 json 中删除通知标签并手动创建我的通知。然后使用@sunil 的方法从启动器活动中检索它。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    System.out.println("Remote Message: " + remoteMessage.toString());
    System.out.println("Token: " + FirebaseInstanceId.getInstance().getToken());
    System.out.println("From: " + remoteMessage.getFrom());
    sendNotification(remoteMessage.getData().toString());
    Log.d(TAG, "Message Data payload" + remoteMessage.getData());
}

private void sendNotification(String messageData) {
    Intent intent = new Intent(this, HomeActivity.class);
    intent.putExtra("data", messageData);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("DeliveryOptions")
            .setContentText("Test")
            .setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_SOUND)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0, notificationBuilder.build());
}

【讨论】:

    【解决方案2】:

    您可以使用 getIntent().getExtras();用于在启动时获取意图以获取意图。

    更多信息here

    例如:

      Bundle bundle = getIntent().getExtras();
      if (bundle != null) {
          if (bundle.containsKey("data")) {
          Intent intent = new Intent(mContext, ExpectedActivity.Class)
          intent.putExtras("PUSH_KEY",bundle.get("data").toString());
          startActivity(intent)
        }
      }
    

    将此代码放在您的启动器活动中。即使应用程序被终止或处于后台,这也会将您导航到预期的活动。

    您也可以尝试像这样更改您的json

    {
    "data" : {
    "body" : "great match!",
    "title": "Portugal vs. Denmark" ,
    "icon  : "myicon," 
    "Nick" : "Mario",
    "Room" : "PortugalVSDenmark"
    },
    "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."
    }
    

    【讨论】:

    • 似乎通过删除 json 中的通知标签就可以了。来源:code.google.com/p/android/issues/detail?id=219084
    • 如果有多个通知怎么办? @sunil
    • @John Sry 对于我在度假时的迟到回复。你想如何处理多个通知?你可以试试 PendingIntent 。
    【解决方案3】:

    根据文档,onMessageReceived() 将在您的应用处于前台或后台时触发通知和数据负载消息。但是,当您的应用程序处于后台时,通知消息将在通知托盘中处理。但是,数据有效负载消息将照常接收(通过 onMessageReceived())。不会有任何问题。在此之前,您必须在客户端应用程序上实现消息处理逻辑。

    check the documentation

    【讨论】:

    • 我尝试在onMessageReceived() 中添加一些打印语句,但它仅在我的应用程序处于前台时触发。
    • 是的。即使是日志也不会在这个阶段工作。谷歌做了一些技巧。您可以在验证 FireBase 类时获取信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    相关资源
    最近更新 更多