Android не может отклонять уведомления, если приложение не открыто - PullRequest
0 голосов
/ 02 апреля 2020

В настоящее время я настраиваю уведомления pu sh для моего приложения Android с FirebaseMessagingService . У меня очень простой сценарий:

  1. На устройство отправляется уведомление со следующими данными:

    Заголовок и основной текст уведомления, а также 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"));
            ...
        }
    
  2. Затем я использую оператор 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, сохраненного в общих префиксах

...