'FCM notification not retrieve when app is closed

I am retrieving the notification from firebase cloud messaging into my android app. but the problem is when my app is opened or in running state in that case only my app is retrieving the notification. if I am not using my app or my app is not opened and I send any push notification that notification is not retrieving inside my app.

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

        mFirestore = FirebaseFirestore.getInstance();

        if (remoteMessage.getData() != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                sendNotificationAPI26(remoteMessage);

            else
                sendNotification(remoteMessage);
        }
    }

    private void sendNotification(RemoteMessage remoteMessage) {

        isNotificationMatching = false;
        Intent intent = new Intent(this, Dashboard.class);
        intent.putExtra("notificationFragment", "showNotifications");
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);


        final Map<String, String> data = remoteMessage.getData();

        String title = data.get("title");
        String description = data.get("description");
        String url = data.get("url");
        String code = data.get("code");
        String actual_price = data.get("actual_price");
        String deal_price = data.get("deal_price");
        String key = data.get("key");
        final String id = data.get("id");

        mFirestore.collection("notifications").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        if (document.getData().get("id").equals(id)) {
                            isNotificationMatching = true;
                            break;
                        }
                    }

                    if (!isNotificationMatching) {
                        postDataToFirebaseServer(data);
                    }

                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
                }
            }
        });


        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.app_logo)
                .setContentText(title)
                .setAutoCancel(true)
                .setSound(defaultSoundUri);
        builder.setContentIntent(pendingIntent);

        NotificationManager noti = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        noti.notify(new Random().nextInt(), builder.build());
    }

    private void postDataToFirebaseServer(Map<String, String> data) {

        Map<String,Object> postDataMap = new HashMap<>();
        postDataMap.put("title", data.get("title"));
        postDataMap.put("description", data.get("description"));
        postDataMap.put("url", data.get("url"));
        postDataMap.put("id", data.get("id"));
        postDataMap.put("code", data.get("code"));
        postDataMap.put("actual_price", data.get("actual_price"));
        postDataMap.put("deal_price", data.get("deal_price"));
        postDataMap.put("key", data.get("key"));

        postDataMap.put("timestamp", FieldValue.serverTimestamp());


        mFirestore.collection("notifications").add(postDataMap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
            @Override
            public void onSuccess(DocumentReference documentReference) {
//                Toast.makeText(getA.this, "Success", Toast.LENGTH_SHORT);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                String error = e.getMessage();
//                Toast.makeText(Testing.this, "Failed", Toast.LENGTH_SHORT);
            }
        });

    }

    private void sendNotificationAPI26(RemoteMessage remoteMessage) {
        Intent intent = new Intent(this, Dashboard.class);
        intent.putExtra("notificationFragment", "showNotifications");
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

        final Map<String, String> data = remoteMessage.getData();

        String title = data.get("title");
        String description = data.get("description");
        String url = data.get("url");
        String code = data.get("code");
        String actual_price = data.get("actual_price");
        String deal_price = data.get("deal_price");
        String key = data.get("key");
        final String id = data.get("id");

        mFirestore.collection("notifications").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        if (document.getData().get("id").equals(id)) {
                            isNotificationMatching = true;
                            break;
                        }
                    }

                    if (!isNotificationMatching) {
                        postDataToFirebaseServer(data);
                    }

                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
                }
            }
        });

        NotificationHelper helper;
        Notification.Builder builder;

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        helper = new NotificationHelper(this);
        builder = helper.getLootBoxNotification(title, description, url, id, code, actual_price, deal_price, key, defaultSoundUri);
        helper.getManager().notify(new Random().nextInt(), builder.build());
        builder.setContentIntent(pendingIntent);

    }
}

I want when my app is closed or not in running state at that time any push notification is sent that will also retrieve inside the application.



Solution 1:[1]

Try removing "notification" key from the payload and provide only "data" key.

Body/Payload/JSON Request:

{
    "collapse_key": "type_a",
    "notification": {
        "badge": "2",
        "module": "announcements",
    "action": "announcementAddedByWarden",
    "id": "2455",
    "title": "Test Notification",
    "body": "Check Notification"
},
"data": {
    "badge": "2",
    "module": "Announcement",
    "id": "2455",
    "title": "Test Notification",
    "body": "Check Notification"
},
"registration_ids": [
    "dJokCoAJRfyHpL3y9rQWxL:APA91bGNszapf1bnQapVHW1CMLT14SXMmjYBmXooRUiiMEWpvawkZ9Kv5SzRz4cnqHhnwFGWT3uXfzgGn3ygysJE1bkfG0nNomCtL_ikDzE0TiP0TZjhQBDSj_1ydFUyrnQKNSnszqgW",
    "dAdFOnor6FE:APA91bHM2FiBf3nfuqcQixr5syVnUcICI8bnA0rxAp1noFLfU9DozGSyJl2jK2wf0EQfIuywA6_1b0_CUmZQoFq1Nhuuz2-bH3uO6MqZ-kfog8TD8USZTUb3MHeK1z6Mtx7RQNAi3UZP"
 ]
}

You can remove data object from the payload as shown in below code snippet:

 "data": {
    "badge": "2",
    "module": "Announcement",
    "id": "2455",
    "title": "Test Notification",
    "body": "Check Notification"
},

Correct format will be:

{
"collapse_key": "type_a",
"notification": {
    "badge": "2",
    "module": "announcements",
    "action": "announcementAddedByWarden",
    "id": "2455",
    "title": "Test Notification",
    "body": "Check Notification"
},
"registration_ids": [
    "dJokCoAJRfyHpL3y9rQWxL:APA91bGNszapf1bnQapVHW1CMLT14SXMmjYBmXooRUiiMEWpvawkZ9Kv5SzRz4cnqHhnwFGWT3uXfzgGn3ygysJE1bkfG0nNomCtL_ikDzE0TiP0TZjhQBDSj_1ydFUyrnQKNSnszqgW",
    "dAdFOnor6FE:APA91bHM2FiBf3nfuqcQixr5syVnUcICI8bnA0rxAp1noFLfU9DozGSyJl2jK2wf0EQfIuywA6_1b0_CUmZQoFq1Nhuuz2-bH3uO6MqZ-kfog8TD8USZTUb3MHeK1z6Mtx7RQNAi3UZP"
  ]
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Shubham Vyas