java – Difference between data and notification in Google Cloud Messages

Question:

In an Android application, I have a service that listens for notifications.

@Override
public void onMessageReceived(String from, Bundle data) {
    Log.e(TAG, "New message: " + data);

    String message = data.getString("message");
    Log.d(TAG, "From: " + from);
    Log.d(TAG, "Message: " + message);

    sendNotification(message);
}

the problem is that this method can only listen to messages of this kind

var message = new gcm.Message({
    collapseKey: 'data',
    priority: 'high',
    contentAvailable: true,
    delayWhileIdle: false,
    timeToLive: 10000,

    data: {
        message: 'Message from gcm server',
    }   

});

Those. I can catch this message in the application and issue the necessary notification myself.

But if I send a message in this format

var message = new gcm.Message({
    collapseKey: 'data',
    priority: 'high',
    contentAvailable: true,
    delayWhileIdle: false,
    timeToLive: 10000,

    notification: {
        title: "Hello, World",
        icon: "ic_launcher",
        body: "This is a notification that will be displayed ASAP."
    }
});

То в приложении метод onMessageReceived() вообще получается что не отрабатывает.

В документации написано что я могу отправлять гибридные сообщения которые как я понимаю должны обрабатываться методом onMessageReceived()

Hybrid messages with both notification and data payload

App behavior when receiving messages that include both notification
and data payloads depends on whether the app is in the background, or
the foreground —essentially, whether or not it is active at the time
of receipt.

When in the background, apps receive the notification payload in the
notification tray, and only handle the data payload when the user taps
on the notification. When in the foreground, your app receives a
bundle with both payloads available. Here is a JSON-formatted message
can containing both notification and data:

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

Вопрос как такое может быть, и как мне можно отлавливать сообщения последнего типа?

Answer:

Вообще есть два состояния push-notification

  • когда приложение открыто

тогда push обрабатывается в методе onMessageReceived() и там как ты распарсил все поля из notification делаешь свою notification и показываешь, а в теле (data)
там его кладешь в intent и по клику по notification открываешь activity сразу с нужным intent (В этот момент нужно точно проработать вид json чтобы не было проблем с данными).

  • второе – это когда приложение закрыто

тогда приложение не знает что пришёл push , но об этом знает система, и тогда поле notification распарсивается системой и выстраивается push-уведомление, в поле click_action можно указать какую активность открывать(TAG), а в своем приложении в manifest прописать этой активности TAG, тогда система сама открое его и в нем сразу будет лежать intent, сформированный системой из тела(data)

А вся остальная работа с intent будет на ваших плечах.

И совет от себя, переходи на FirebaseCloudMessage, отличная обертка над gcm.

Scroll to Top