如果推送通知包含特定元素,则隐藏推送通知

我不会显示收到的推送通知,因为它出现在顶部通知菜单我的通知,如果它有例如键。现在,如果我收到使用此键的通知,则所有通知都在通知栏中。我不想向用户显示此通知。update

我用于处理通知,如下所示: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();
            }
        }
    }
}

更新:

我稍微改变了一下项目,并用和他的,我做了如下事情:OnesignalNotificationExtenderService

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;
    }
}

它阻止了显示带有更新密钥的通知,但现在我没有在我的PusterReceiver中收到它来启动我的服务。有没有简单的方法将数据从我收到的结果发送到我的?NotificationNotDisplayingExtenderPusherReceiver

现在看来,我的PusterReceiver不会启动他的方法。onReceive

非常感谢您的提前帮助。


答案 1

有两种类型的有效负载。1. 数据 2.通知

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

仅使用数据有效负载。然后,您始终在FirebaseMessagingService onMessageRececived Method中收到调用


答案 2

事情基本上是我们有两种类型的通知。

可以称为通知类型的一个是,推送在发送/接收捆绑包中有一个对象,在应用程序中,当你的应用处于前台并收到通知时,你必须处理它。在这种情况下,如果你的应用位于前台,则可以处理它并执行任何不显示通知的操作。但是,如果应用程序处于后台,则Google将自动创建通知,并且需要接收的推送捆绑包中的预定义和对象来发出通知。notificationtitlemessage

第二种类型可以称为数据类型,在发送/接收的捆绑包中没有任何对象。在这种情况下,你的应用处于前台或后台,你应该处理所有内容。因此,如果您将数据放在推送通知消息的对象中,则所有内容都将掌握在您手中。notificationdata

因此,简而言之,只需将数据放在通知的对象中,并实现所需的逻辑即可。data


推荐