如果应用程序未打开,Android无法关闭通知

时间:2020-04-02 13:45:14

标签: android firebase push-notification firebase-cloud-messaging

我目前正在使用 FirebaseMessagingService 在Android应用程序上设置推送通知。我有一个非常简单的场景:

  1. 具有以下内容的通知将发送到设备:

    通知标题和正文,以及包含通知类型和某些预订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"));
            ...
        }
    
  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与随机生成的通知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没有值

0 个答案:

没有答案