当应用程序处于后台时,为什么 onMessageReceived() 方法没有正确传递意图?

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

实际上,我正在尝试通过单击 push-notification 将意图传递给 activity,并且当应用程序出现在 foreground 中时它工作正常。但是当应用程序是在后台,虽然我收到 push-notification 没有任何问题,但通过单击该通知,我并没有在 activity 中获得意图。我试着在 SO 中提到一些问题,并尝试添加像 PendingIntent.FLAG_UPDATE_CURRENT 这样的标志, PendingIntent.FLAG_ONE_SHOT,然后本意 (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP ) 但其中 none 很有帮助。请帮我解决这个问题,这两天脖子一直很痛。

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>

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());
    }
}

我认为问题是因为您正在从 fcm 控制台发送通知!

来自文档

"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."

您应该尝试使用 Fcm apis

发送通知

假设 我认为您在使用 api 时不应发送通知参数,只需发送数据参数并解析 onMessageReceived 中的数据,如果您发送通知,它将传送到系统托盘