我目前正在使用 FirebaseMessagingService 在Android应用程序上设置推送通知。我有一个非常简单的场景:
具有以下内容的通知将发送到设备:
通知标题和正文,以及包含通知类型和某些预订ID的HashMap数据。
这是我在Android应用中提取此数据的方式:
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
if (!remoteMessage.getData().isEmpty()) {
Map<String, String> payload = remoteMessage.getData();
String notificationType = payload.get("NOTIFICATION_TYPE");
int bookingId = Integer.parseInt(payload.get("BOOKING_ID"));
...
}
然后我使用switch语句根据通知类型执行不同的操作:
switch (notificationType){
case "ALLOWED":
createCheckinNotification(remoteMessage, bookingId);
break;
case "HIDE_CANCEL":
case "MANUAL_CANCEL":
Notification.dismissNotificationForBooking(getApplicationContext(), bookingId);
break;
}
现在,当我致电createCheckinNotification(remoteMessage, bookingId)
时,我将bookingId与随机生成的通知ID相对保存:
SharedPreferences sharedPreferences = context.getSharedPreferences("bookings", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(String.valueOf(notification.bookingId), notification.id);
editor.commit();
当我打电话给Notification.dismissNotificationForBooking(getApplicationContext(), bookingId);
时,我检查了共享的偏好设置,以获取将其删除的通知ID。
public static void dismissNotificationForBooking(Context context, int bookingId) {
SharedPreferences sharedPreferences = context.getSharedPreferences("bookings", Context.MODE_PRIVATE);
String bookingIdString = String.valueOf(bookingId);
int notificationId = sharedPreferences.getInt(bookingIdString, -1);
if (notificationId != -1){
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(notificationId);
}
}
现在,当应用程序运行时,此代码可以正常工作。但是,当应用程序未运行或处于后台时,关闭通知将永远无法工作,我也不知道为什么。也因为该应用程序未运行,因此无法调试该应用程序。
编辑1 我使用文件资源管理器检查了“共享首选项”,当应用程序不在前台时,似乎没有将数据保存到共享首选项中,但是当应用程序打开时,数据保存得很好
编辑2 当我的签到代码运行时,我使用以下命令将测试值添加到共享首选项中:
SharedPreferences sharedPreferences = context.getSharedPreferences("bookings", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("teststring", "value");
editor.commit();
当应用程序在后台运行/不运行时,永远不会添加该值。似乎与我的通知ID相同。如果应用程序在后台运行,则不会将其添加到共享偏好设置中,因此当我们尝试取消该通知时,共享偏好设置中保存的bookingId没有值