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

时间:2018-03-05 14:39:17

标签: java android react-native react-native-android onesignal

如果有关键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();
            }
        }
    }
}

更新:

我改变了一点项目并使用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方法。

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

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

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

仅使用数据有效负载。然后,您始终可以使用FirebaseMessagingService onMessageRececived方法

进行调用

答案 1 :(得分:1)

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

可以称为通知类型的一个是,push在发送/接收的包中有一个notification对象,当你的应用处于前台时,你必须处理它收到通知。在这种情况下,如果您的应用程序位于前台,那么您可以处理它并执行您不喜欢的任何未显示通知的内容。但是,如果应用程序处于后台,则会自动通过Google创建通知,并在收到的推送包中使用预定义的titlemessage个对象进行通知。

可以称为数据类型的第二种类型,在发送/接收的包中没有任何notification对象。在这种情况下,您的应用程序处于前台或后台,您应该处理所有内容。因此,如果您将数据放在推送通知消息的data对象中,那么一切都将在您手中。

因此,简而言之,只需将数据放入通知的data对象中,然后实现所需的逻辑。

答案 2 :(得分:1)

我没有看到您所指的JSON数据。但是,我认为您的JSON中的update键包含null。在您的代码中,您正在检查JSON数据中是否包含密钥update。如果密钥存在于JSON正文中,则此函数将始终返回true。您可能具有null值的字段,表示您不应在系统托盘中显示通知。

在这种情况下,您可以考虑使用isNull功能。如果此对象没有update的映射,或者它的值为null的映射,则返回true。

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

是的,请使用您收到的通知中的data有效负载。

答案 3 :(得分:0)

每当notify NotificationManager显示通知时,您都会提供一个ID,用于稍后编辑或取消该通知的通知。如果您按manager.notify(notificationId, notification)显示通知,则可以使用manager.cancel(notificationId)取消通知。

如果您要删除所有通知,可以使用NotificationManager.cancelAll()