Скрыть 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
из полученного уведомления.