如果有关键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
方法。
非常感谢您的帮助。
答案 0 :(得分:2)
有两种类型的有效载荷。 1.数据 2.通知
https://developers.google.com/cloud-messaging/concept-options
仅使用数据有效负载。然后,您始终可以使用FirebaseMessagingService onMessageRececived方法
进行调用答案 1 :(得分:1)
事情基本上我们有两种类型的通知。
可以称为通知类型的一个是,push在发送/接收的包中有一个notification
对象,当你的应用处于前台时,你必须处理它收到通知。在这种情况下,如果您的应用程序位于前台,那么您可以处理它并执行您不喜欢的任何未显示通知的内容。但是,如果应用程序处于后台,则会自动通过Google创建通知,并在收到的推送包中使用预定义的title
和message
个对象进行通知。
可以称为数据类型的第二种类型,在发送/接收的包中没有任何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()
。