В настоящее время я настраиваю уведомления pu sh для моего приложения Android с FirebaseMessagingService . У меня очень простой сценарий:
На устройство отправляется уведомление со следующими данными:
Заголовок и основной текст уведомления, а также 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 для идентификатора уведомления, который был сгенерирован случайным образом:
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);
, я проверяю общие настройки, чтобы получить идентификатор уведомления для его удаления.
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 Я проверил общие настройки с помощью файлового менеджера, и похоже, что данные не сохраняются в общих настройках, когда приложение не на переднем плане, но хорошо сохраняются, когда приложение open
EDIT 2 Когда мой код регистрации запускается, я добавляю тестовое значение в общие префы со следующими параметрами:
SharedPreferences sharedPreferences = context.getSharedPreferences("bookings", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("teststring", "value");
editor.commit();
Когда приложение находится в фоновом режиме / нет запуск этого значения никогда не добавляется. Похоже, та же проблема с моим идентификатором уведомления. Он не добавляется в общие префы, если приложение работает в фоновом режиме, поэтому, когда мы пытаемся отклонить уведомление, не сохраняется никакого значения для bookingId, сохраненного в общих префиксах