我在firebase中发布了推送通知服务并发送了数据通知并在onMessageReceived(RemoteMessage remoteMessage)
中很好地接收了它,
我很清楚何时发送哪种类型的通知,这就是我在应用程序被杀时使用数据通知来获取通知的原因。
但在我的情况下,当应用处于前台模式时,我不想发送任何通知,因为当应用处于前台模式时,onMessageReceived(RemoteMessage remoteMessage)
将始终被调用。
如何防止这种情况?
我的通知格式是这个..
{
"to" : "cGPhwcLbe5Y:APA91bFVAR6n9GxbDBovzd8X9nMBvKZ4Z098FzmkMGGUAuMhdps4uEof8mppUh7vrFTAsdFGzyurHa4gQ1nWgP-ncaN53ZtHziLi8YdHMEOGvtx6pA7ttCY5QhE5XKdFZ2QfX",
"data" : {
"message":"hi"
}
}
答案 0 :(得分:3)
您可以从服务器发送2种不同类型的消息。
其中通知消息由 firebase 本身处理。
数据消息是自定义有效内容,您需要管理自己的通知。
因此您需要在服务器脚本中使用数据密钥。
并根据此回答https://stackoverflow.com/a/27689352/942224
检查哪个应用在顶层堆栈中运行private boolean isAppInForground(Context context, String packageName){
String[] activePackages;
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activePackages = getActivePackages(am);
if (activePackages != null) {
return activePackages[0].equals(packagName)
}
return false;
}
private String[] getActivePackages(ActivityManager mActivityManager) {
final Set<String> activePackages = new HashSet<>();
final List<ActivityManager.RunningAppProcessInfo> processInfos = mActivityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
activePackages.addAll(Arrays.asList(processInfo.pkgList));
}
}
return activePackages.toArray(new String[activePackages.size()]);
}
答案 1 :(得分:0)
只有当您的应用位于前台时,通知才会发送到您的onMessageReceived
回调。如果您的应用在后台或已关闭,则会在通知中心显示通知消息。如果您想阻止在您的应用位于前台时调用onMessageReceived
。从你的应用中删除FirebaseMessagingService
。
检查docuemnt: Send your First Message to a Backgrounded App