Как разрешить FCM отображать уведомления, даже когда приложение находится на переднем плане? - PullRequest
0 голосов
/ 03 декабря 2018

Позволяет FCM обрабатывать уведомления на устройстве, если это не сообщение данных.

Как заставить Android отображать уведомления с использованием FCM, даже если приложение находится на переднем плане?Я не хочу создавать собственное уведомление.

Я отправляю в приложение два типа сообщений: сообщение с данными и обычное уведомление.Сообщения с данными обрабатываются в onMessageReceived(), независимо от того, находится приложение в фоновом режиме или на переднем плане или уничтожено, что OK .Но теперь я также отправляю обычные уведомления через консоль Firebase, и они автоматически отображаются, когда приложение находится в фоновом режиме, но когда приложение находится на переднем плане, вызывается onMessageReceived().Здесь мне нужно было бы как-то сказать FCM показать содержимое без необходимости создавать уведомление.

Я пытался с:

@Override public void onMessageReceived(RemoteMessage remoteMessage) {
        if(remoteMessage.getData() == null || !remoteMessage.getData().containsKey("specificKey")) {
            // notification msg, let FCM handle it
            super.onMessageReceived(remoteMessage); // this is not working - I want FCM to show notification the same as if the app was in background. 
            return;
        } else {
          // data message, I'm handling it on my own and showing a custom notification, working fine and well
        }
}

Но это моя собственная обработка через код, и я хочу, чтобы FCM как-то это сделал.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

В этом случае вы должны обработать остальную часть, чтобы отобразить пользовательское уведомление следующим образом:

class FCMMessagingService: FirebaseMessagingService() {
    var dataMap: Map<String, String>? = null
    var body: String = ""
    var title: String = ""

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

        dataMap = remoteMessage?.data
        Log.d("Data Map", dataMap.toString())

        try {
            val jsonObject = JSONObject(dataMap?.get("data")!!)
            val contentInfo = jsonObject.get("contentInfo") as JSONObject

            val time = contentInfo.getString("time")
            var message = jsonObject.getString("message")
            message = message.replace("<time>", Utils.getTimeFromTimestamp(time.toLong(), true))
            body = message
        } catch (e:JSONException) {
            e.printStackTrace()
        }

        title = dataMap?.get("title")!!
        if(Foreground.get().foreground) {
            sendBroadCast(title , body)
        } else {
            createNotification(title, body)
        }
    }

    private fun createNotification(title: String, body: String) {
        val intent = Intent(this, DashBoardActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

        val pendingIntent = PendingIntent.getActivity(this, Calendar.getInstance().timeInMillis.toInt(), intent,
                PendingIntent.FLAG_ONE_SHOT)

        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        val notification = NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.noti)
                .setContentTitle(title)
                .setContentText(body)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent)
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            notification.color = resources.getColor(R.color.toolBarColor)
        }

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.notify(Calendar.getInstance().timeInMillis.toInt(), notification.build())
    }

    private fun sendBroadCast(title: String, body: String) {
        val broadCastIntent = Intent(Constant.NOTIFICATION)
        broadCastIntent.putExtra("title", title)
        broadCastIntent.putExtra("body", body)
        LocalBroadcastManager.getInstance(this).sendBroadcast(broadCastIntent)
        // val intent = Intent(this, DashBoardActivity::class.java)
        // intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
    }
}

Я полагаю, вам придется делать это только так, как FCM выиграл 'Я все равно не справлюсь с этим .Надеюсь, это поможет вам.

0 голосов
/ 03 декабря 2018

Когда приложение не на переднем плане, уведомления обрабатываются системой.Это по определению, и нет способа изменить поведение.

Если вы хотите контролировать то, что отображается, когда приложение не на переднем плане, вам придется отправить сообщение с данными.

...