Скрыть push-уведомление, если оно содержит определенные элементы

Я не буду показывать полученное push-уведомление из главного меню уведомлений о моем уведомлении, если оно имеет, например, ключевое update. Пока, если я получаю уведомление с этим ключом, все уведомления отображаются в панели уведомлений. Я не хочу представлять эти уведомления для пользователя.

Я использую WakefulBroadcastReceiver для обработки уведомлений, как WakefulBroadcastReceiver ниже:

public class PusherReceiver extends WakefulBroadcastReceiver {
    private boolean isAppOnForeground(Context context) {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
        if (appProcesses == null) 
            return false;

        final String packageName = context.getPackageName();
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
                return true;
            }
        }

        return false;
    }

    public void onReceive(final Context context, Intent intent) {
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        if (!isAppOnForeground((context))) {
            String pushNotificationBody = intent.getStringExtra("alert");

            try {
                JSONObject notificationData = new JSONObject(pushNotificationBody);

                // This is the Intent to deliver to our service.
                Intent service = new Intent(context, BackgroundService.class);
                // Put here your data from the json as extra in in the intent
                service.putExtra("notification", pushNotificationBody);

                Log.i("PUSH_NOTIFICATION_JSON", "RECEIVED JSON " + notificationData);

                // Start the service, keeping the device awake while it is launching.
                if (!notificationData.has("update")) {
                    startWakefulService(context, service);
                } else {
                    // Do nothing
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

ОБНОВИТЬ:

Я немного изменил проект, и с Onesignal и его NotificationExtenderService я сделал что-то вроде ниже:

public class NotificationNotDisplayingExtender extends NotificationExtenderService {
    @Override
    protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {
        String notification = receivedResult.toString();
        String notificationBody = receivedResult.payload.body;
        JSONObject notificationBodyJSON = null;
        try {
            notificationBodyJSON = new JSONObject(notificationBody);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        JSONObject pushNotificationData = notificationBodyJSON;
        boolean hidden = false;

        if (pushNotificationData.has("update")) {
            Log.i("NOTIFICATION MANAGER", "PREVENT DISPLAY NOTIFICATION");

            hidden = true;
        }


        // Return true to stop the notification from displaying.
        return hidden;
    }
}

И это предотвращает отображение уведомлений с помощью ключа обновления, но теперь я не получаю его в своем PusherReceiver для запуска моего сервиса. Есть ли простой способ отправить данные из моего NotificationNotDisplayingExtender receivedResult в мой PusherReceiver?

На данный момент похоже, что мой PusherReceiver не onReceive его метод onReceive.

Большое спасибо за помощь заранее.

Ответ 1

Каждый раз, когда вы notify NotificationManager чтобы показывать уведомление, вы предоставляете идентификатор, который будет использоваться для уведомления, для последующего редактирования или отмены этого уведомления. Если вы показываете уведомление с помощью manager.notify(notificationId, notification), вы можете отменить его с помощью manager.cancel(notificationId).

Если вы хотите удалить все уведомления, вы можете использовать NotificationManager.cancelAll().

Ответ 2

Существует два типа полезной нагрузки. 1. Данные 2. Уведомление

https://developers.google.com/cloud-messaging/concept-options

Используйте только полезную нагрузку данных. Затем вы всегда получаете вызов в FirebaseMessagingService onMessageRececived Method

Ответ 3

Дело в том, что у нас есть два типа уведомлений.

Тот, который можно назвать " Тип уведомления", заключается в том, что push имеет объект notification в отправленном/полученном пакете, в котором вы должны обращаться с ним, когда ваше приложение находится на переднем плане и получено уведомление. В этом случае, если ваше приложение находится на переднем плане, вы можете обрабатывать его и делать все, что хотите, что не показывает уведомление. Но если приложение находится в фоновом режиме, уведомление будет автоматически создаваться с помощью google, и для получения уведомления требуется предопределенный title и объекты message в полученном пакете push.

Второй тип, который можно назвать типом данных, не имеет никакого объекта notification в отправляемом/полученном пакете. В этом случае ваше приложение находится на переднем плане или на заднем плане, вы должны обрабатывать все. Так что, если вы поместите ваши данные в data объекте вашего сообщения уведомления толчка, все будет в ваших руках.

Так, в общем, просто поместите ваши данные в data объекте вашего уведомления и реализовать требуемую логику.

Ответ 4

Я не вижу данных JSON, на которые вы ссылаетесь. Тем не менее, я полагаю, что ключ update в вашем JSON содержит null. В своем коде вы проверяете, если данные в формате JSON имеет ключевое update в нем. Эта функция всегда возвращает true, если ключ существует в теле JSON. Возможно, у вас есть поле с null значением, которое указывает на то, что вы не должны показывать уведомление в системном трее.

В этом случае вы можете использовать функцию isNull. Он возвращает true, если этот объект не имеет сопоставления для update или имеет сопоставление, значение которого равно null.

// Start the service, keeping the device awake while it is launching.
if (!notificationData.isNull("update")) {
    startWakefulService(context, service);
} else {
    // Do nothing
}

И да, пожалуйста, используйте полезную нагрузку data из полученного уведомления.