Не вызывать push-уведомления, когда приложение используется (работает на переднем плане) - PullRequest
0 голосов
/ 24 мая 2018

В моем приложении для Android я получаю push-уведомления через Firebase Cloud Messaging.Уведомления работают совершенно нормально, единственная проблема в том, что я не хочу получать уведомления, когда приложение работает.Когда пользователь использует точку доступа, я уже отображаю уведомление внутри, поэтому push-уведомление является избыточным и раздражающим.Ниже приведен код того, как я вызываю push-уведомление:

@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 при закрытии приложения не кажется идеальным решением.Должен быть лучший способ, но я не могу его найти.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 24 мая 2018

Я использую 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, надеюсь, у вас не возникнет проблем

...