Android Don';在使用应用程序时调用推送通知(在前台运行)

Android Don';在使用应用程序时调用推送通知(在前台运行),android,firebase,push-notification,firebase-cloud-messaging,Android,Firebase,Push Notification,Firebase Cloud Messaging,在我的android应用程序中,我通过Firebase云消息接收推送通知。通知工作完全正常,唯一的问题是我不想在应用程序运行时收到通知。当用户使用ap时,我已经在内部显示了通知,因此推送通知是多余和烦人的。下面是关于如何调用推送通知的代码: @Override public void onMessageReceived(RemoteMessage remoteMessage) { NotificationCompat.Builder notificationBuilder = (Noti

在我的android应用程序中,我通过Firebase云消息接收推送通知。通知工作完全正常,唯一的问题是我不想在应用程序运行时收到通知。当用户使用ap时,我已经在内部显示了通知,因此推送通知是多余和烦人的。下面是关于如何调用推送通知的代码:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_stat_name)
            .setContentTitle(messageTitle)
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setVibrate(pattern)
            .setLights(Color.BLUE,1,1)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(notificationId, notificationBuilder.build());
}

我尝试了这个解决方案,但它在我的情况下不起作用,因为我确实希望在应用程序处于后台或被终止时收到通知。当应用程序启动时,将布尔值设置为
true
,当应用程序关闭时,将布尔值设置为
false
,这似乎不是一个理想的解决方案。一定有更好的办法,但我找不到。任何帮助都将不胜感激。

我所做的就是在应用程序类中使用ActivityLifeCycleCallbacks

class MyApplication:Application(){
companion object {
        private var activitiesOpen = 0

        var displayActivity:String?= null
        private set

        fun isAppOpen() = activitiesOpen > 0
    }
    private val activitiesListener = object : ActivityLifecycleCallbacks{
        override fun onActivityPaused(activity: Activity?) {
            --activitiesOpen
            displayActivity = null
        }

        override fun onActivityResumed(activity: Activity?) {
            activitiesOpen++
            displayActivity = if(activity != null)
                activity::class.simpleName else null
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }

        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
        }
    }

}
现在,在您的onMessageReceived中,您可以这样查看它

    if (MyApplication.isAppOpen() &&
                DashboardActivity::class.simpleName?
.equals(MyApplication.displayActivity) ?: false) {
// you can eliminate the last condition if you wish

            playAlertTone(context) // or whatever
        } else {
           // your notification building code
        }

代码在kotlin中,我希望您不会有问题。

我要做的是在应用程序类中使用ActivityLifeCycleCallbacks

class MyApplication:Application(){
companion object {
        private var activitiesOpen = 0

        var displayActivity:String?= null
        private set

        fun isAppOpen() = activitiesOpen > 0
    }
    private val activitiesListener = object : ActivityLifecycleCallbacks{
        override fun onActivityPaused(activity: Activity?) {
            --activitiesOpen
            displayActivity = null
        }

        override fun onActivityResumed(activity: Activity?) {
            activitiesOpen++
            displayActivity = if(activity != null)
                activity::class.simpleName else null
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }

        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
        }
    }

}
现在,在您的onMessageReceived中,您可以这样查看它

    if (MyApplication.isAppOpen() &&
                DashboardActivity::class.simpleName?
.equals(MyApplication.displayActivity) ?: false) {
// you can eliminate the last condition if you wish

            playAlertTone(context) // or whatever
        } else {
           // your notification building code
        }
代码在kotlin中,我希望您不会有问题