>我正在使用 FCM 在我的应用程序中发送推送通知。推送通知完美地传递,此外,我希望每当用户单击特定通知时,(要求-1)我都可以从那里选择通知的标题并将其发送到活动(我需要在推送通知单击时打开),为此我在FirebaseMessagingService类中使用此代码:
private void handleNotification(RemoteMessage remoteMessage) {
String notTitle = remoteMessage.getNotification().getTitle();
String notBody = remoteMessage.getNotification().getBody();
Intent resultIntentMainArticle = new Intent(this, HomeActivity.class);
resultIntentMainArticle.putExtra("pushNotificationClick", "yes");
resultIntentMainArticle.putExtra("heading", ""+notTitle);
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntentMainArticle, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setSmallIcon(R.mipmap.icon_not);
mBuilder.setColor(getResources().getColor(R.color.colorPrimary));
mBuilder.setContentTitle(notTitle)
.setContentText(notBody)
.setAutoCancel(true)
.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
notificationChannel.enableLights(true);
assert mNotificationManager != null;
mBuilder.setSmallIcon(R.mipmap.icon_not);
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
mNotificationManager.createNotificationChannel(notificationChannel);
}
assert mNotificationManager != null;
mNotificationManager.notify((int) System.currentTimeMillis() /* Request Code */, mBuilder.build());
}
一旦打开了请求的活动,(要求-2)我需要使用该标题与活动中使用的查看页中的帖子匹配,并通过设置查看页程序项在查看页上显示具有相同标题的帖子。
但问题是,一旦用户在单击任何一个之前收到了多个通知,然后他单击了他首先收到的通知,在活动内部,我没有得到单击通知的确切标题,它总是传递最近通知的标题。
我不确定我哪里做错了,或者我是否可以使用其他方法来实现这一目标。
您的所有通知都使用相同的待处理意图:
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntentMainArticle, PendingIntent.FLAG_UPDATE_CURRENT);
这将始终更新唯一的待处理意图,因为您使用的 ID 始终为"0"(有关更多详细信息,请参阅待处理意图匹配)。因此,您的 PendingIntent 将始终使用最新的 resultIntentMainArticle 进行更新,其中包含上次收到的推送消息的标题。 尝试使每个待处理的意图都独一无二,这样它们就不会被覆盖。
正如 Tidder 在答案链接中提到的,这是(Requirements-1)的答案,我在 PendingIntent 中为每个通知使用相同的 ID,因此每次都用最新数据覆盖 PendingIntent,现在我每次都使用唯一 ID 并获得正确的数据。
更新了挂起的意图的代码
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), resultIntentMainArticle, PendingIntent.FLAG_UPDATE_CURRENT);
现在来看我的第二个要求(要求-2)
我想在我的活动中使用用户单击的特定通知的标题,在这里我遇到了一个问题,即接收的数据每次都是空的,因为我开始使用捆绑向我的活动发送数据,现在我能够在我的活动中正确接收数据,如下所示:
更新了用于将数据发送到活动的代码
Bundle bundle = new Bundle();
bundle.putString("pushClick", "yes");
bundle.putString("pushHead", ""+notTitle);
resultIntentMainArticle.putExtras(bundle);
由于这是我问题的完整答案,因此我将这个答案标记为可接受的答案。