在android中 - 如何在应用程序处于前台时阻止Firebase推送通知?

时间:2017-01-19 07:07:13

标签: android firebase push-notification firebase-cloud-messaging

我在firebase中发布了推送通知服务并发送了数据通知并在onMessageReceived(RemoteMessage remoteMessage)中很好地接收了它,

我很清楚何时发送哪种类型的通知,这就是我在应用程序被杀时使用数据通知来获取通知的原因。

但在我的情况下,当应用处于前台模式时,我不想发送任何通知,因为当应用处于前台模式时,onMessageReceived(RemoteMessage remoteMessage)将始终被调用。

如何防止这种情况?

我的通知格式是这个..

{
   "to" : "cGPhwcLbe5Y:APA91bFVAR6n9GxbDBovzd8X9nMBvKZ4Z098FzmkMGGUAuMhdps4uEof8mppUh7vrFTAsdFGzyurHa4gQ1nWgP-ncaN53ZtHziLi8YdHMEOGvtx6pA7ttCY5QhE5XKdFZ2QfX",
   "data" : {
    "message":"hi"
 }

}

2 个答案:

答案 0 :(得分:3)

您可以从服务器发送2种不同类型的消息。

enter image description here

其中通知消息 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