Search code examples
androidfirebase-cloud-messagingpostmanandroid-push-notification

How to do custom turn on/off push notification in Background and Kill


I need to develop custom turn off/on push notification. Value "on" or "off" I get from SharedPreferences.

In Foreground the option of turn off works well because it can set in onMessageReceived.

But how to do this options for Kill and Background modes?

For sending push notifications I use Postman.

My code in FMC:

class MyFirebaseMessagingService : FirebaseMessagingService() {

private val CURRENT_PUSH = "currentPush"
private var sPref: SharedPreferences? = null

override fun onMessageReceived(remoteMessage: RemoteMessage?) {
    super.onMessageReceived(remoteMessage)

    if(loadCurrentPushNotification()) {
        if (remoteMessage!!.data != null) sendNotification(remoteMessage)
    }
}

private fun sendNotification(remoteMessage: RemoteMessage) {
    val data = remoteMessage.data

    val title = data["title"]
    val content = data["content"]

    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    val NOTIFICATION_CHANNEL_ID = "1234"

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        @SuppressLint("WrongConstant") val notificationChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID,
                "SA Notification",
                NotificationManager.IMPORTANCE_MAX)

        notificationChannel.description = "SA channel notification"
        notificationChannel.enableLights(true)
        notificationChannel.lightColor = Color.RED
        notificationChannel.vibrationPattern = longArrayOf(0, 1000, 500, 1000)
        notificationChannel.enableVibration(true)

        notificationManager.createNotificationChannel(notificationChannel)
    }


    val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)

    notificationBuilder.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.sa_launcher)
            .setContentTitle(title)
            .setContentText(content)
            .setContentInfo("Breaking")

    notificationManager.notify(1, notificationBuilder.build())
}

private fun loadCurrentPushNotification(): Boolean { //to read the status push notification from SharedPreferences
    sPref = getSharedPreferences("pushesOnOff", Context.MODE_PRIVATE)
    return sPref!!.getBoolean(CURRENT_PUSH, true)
}

}

Solution

  • I suspect that your push notification payload/content contains the notification key like

    notification : { 'title':'This is title' }

    If this is true, then you will not receive the onMessageReceived callback when your app is killed and hence your check will not work. In order to prevent this, remove the notification from your payload and only send data and it should work without any change on android side.

    You can read about this behavior HERE.