Search code examples
androidfirebasefirebase-cloud-messagingandroid-pendingintent

Why onMessageReceived() method is not passing intent properly when the app is in background?


Actually I'm trying to pass intent to an activity on click of the push-notification and it's working fine when the app is present in foreground.But when the app is in background although I'm receiving the push-notification without any problem but by clicking that notification I'm not getting intent in the activity. I tried to refer some questions in SO and tried adding flags likePendingIntent.FLAG_UPDATE_CURRENT, PendingIntent.FLAG_ONE_SHOT,then in intent (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP ) but none of them were helpful . Please help me to solve this issue it's been a pain in the neck from last two days.

Manifest.XML:

<activity android:name=".activities.ProfileHolder"
        android:windowSoftInputMode="adjustPan"
        android:screenOrientation="portrait"
        android:exported="true"
        android:launchMode="singleTop"
       >
        <intent-filter>
            <action android:name="profile" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

Notification Code in Node.js:

var message = {
         to: u.fcm_token, 
         collapse_key: 'white', //anything can be given
         data: {
             type:"likes",
             post_owner_username:data.like_post_owner_username,
             owner_post_time:data.like_post_owner_time

         },
         priority: 'high',
         notification: {
             title: 'Infinity',
             body:notif_data,
             sound: "default",
             click_action: "profile",
             tag:"Hey Bro" //if specified then current msg would be  replaced by new msg
         }
     };

     fcm.send(message, function(err, response){
         if (err) {
             console.log(err);
         } else {
             console.log("Successfully sent with response: ", response);
         }
     });

FirebaseMessagingService Class :

/Varibales for notifications
String title, body, post_owner_username, post_owner_time, notif_commenter_username, notif_comment_time, follower_username,messager_username,type,action;
@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {
    title=remoteMessage.getNotification().getTitle();
    body=remoteMessage.getNotification().getBody();
    type=remoteMessage.getData().get("type");
    action=remoteMessage.getNotification().getClickAction();

    Log.d("type",type);
    Log.d("type-2",title);

   if(type.equals("likes")){
       post_owner_username=remoteMessage.getData().get("post_owner_username");
       post_owner_time=remoteMessage.getData().get("owner_post_time");
   }
   else if(type.equals("comments")||type.equals("comment_likes")){
       post_owner_username=remoteMessage.getData().get("post_owner_username");
       post_owner_time=remoteMessage.getData().get("owner_post_time");
       notif_commenter_username=remoteMessage.getData().get("commenter_username");
       notif_comment_time=remoteMessage.getData().get("comment_time");
   }
   else if(type.equals("follow")){
       follower_username=remoteMessage.getData().get("follower_username");
   }
   else if(type.equals("messaging")){
       messager_username=remoteMessage.getData().get("sender_username");
   }

    //Showing Notification

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(getApplicationContext(), Constants.CHANNEL_ID)
                    .setSmallIcon(R.drawable.new_icon)
                    .setContentTitle(title)
                    .setContentText(body);

    Intent i = new Intent(action);
    Bundle b = new Bundle();
    if (type.equals("likes")) {
        b.putString("post_owner_username", post_owner_username);
        b.putString("post_owner_time", post_owner_time);
        b.putString("what", "show_notification_post");
        b.putString("Open","starred");

        // i.putExtra("Open", "starred");
    }
    else if (type.equals("comments")) {
        b.putString("post_owner_username",post_owner_username);
        b.putString("post_owner_time", post_owner_time);
        b.putString("notif_commenter_username", notif_commenter_username);
        b.putString("notif_comment_time",notif_comment_time);
        b.putString("what", "show_notification_post");
        b.putString("Open","starred");
        //i.putExtra("Open", "starred");
    }
    else if (type.equals("comment_likes")) {

        b.putString("post_owner_username", post_owner_username);
        b.putString("post_owner_time", post_owner_time);
        b.putString("notif_commenter_username", notif_commenter_username);
        b.putString("notif_comment_time", notif_comment_time);
        b.putString("what", "show_notification_post");
        b.putString("Open","starred");
        // i.putExtra("Open", "starred");
    }
    else if (type.equals("follow")||type.equals("follow_request")) {
        b.putString("searchUsername", follower_username);
        b.putString("Open","search_profile");
        //i.putExtra("Open", "search_profile");
    }
    else if(type.equals("messaging")){
        b.putString("Open","messaging");
        b.putString("msg_username",messager_username);
    }

    i.putExtras(b);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP );
    //ctx.startActivity(i);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);

    /*
     *  Setting the pending intent to notification builder
     * */

    mBuilder.setContentIntent(pendingIntent);

    NotificationManager mNotifyMgr =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);


    if (mNotifyMgr != null) {
        mBuilder.setAutoCancel(true);
        mNotifyMgr.notify(1, mBuilder.build());
    }
}

Solution

  • i think the problem is because your are sending notification from fcm console !

    From the docs

    "When your app is in the background on a user's device, notifications are delivered to the system tray. When a user clicks on the notification, the app launcher opens your app. If you want, you can also add client message handling to receive notifications in your app when it is already in the foreground on the user's device."

    you should try sending notification with Fcm apis

    Hypothesis i think you should not send notification parameter when you are using api just send data parameter and parse the data in your onMessageReceived if you send notification it will delivered to system tray

    How to handle notification when app in background in Firebase