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



实际上,我正在尝试在单击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 )但他们都没有帮助。请帮我解决这个问题,过去两天脖子很痛。

清单.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>

节点.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);
         }
     });

Firebase消息服务类 :

/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 控制台发送通知!

从文档中

"当你的应用在用户设备上的后台运行时,通知 交付到系统托盘。当用户单击 通知,应用启动器将打开您的应用。如果你愿意,你可以 还可以添加客户端消息处理以在应用中接收通知 当它已经在用户设备上的前台时。

您应该尝试使用 FCM API 发送通知

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

如何在 Firebase 中应用在后台运行时处理通知

相关内容

最新更新