通过 FirebaseMessagingService 从后台上传数据到服务器 class

Upload data to server from background through FirebaseMessegingService class

在我的应用程序中,我使用 FCM 来获取通知。当我的应用程序在前台 运行 时一切正常,但当应用程序进入后台或应用程序从后台被杀死时 问题开始,在这种情况下我收到通知但数据未上传服务器。

为了将数据上传到服务器,我使用了一个单独的 class,其中编写了所有必需的代码,我只是在 FirebaseMessagingService() class.

我试了所有可能的方法,我尝试做单独的服务,但没有用。

但我想在收到通知时将数据上传到服务器。

这是我的 FirebaseMessegingService Class

class FirebaseShareDevMessagingService : FirebaseMessagingService() {

private var resultIntent: Intent? = null

override fun onNewToken(p0: String) {
    super.onNewToken(p0)
}

var mNotificationManager: NotificationManager? = null


@RequiresApi(Build.VERSION_CODES.O)
override fun onMessageReceived(remoteMessage: RemoteMessage) {
    super.onMessageReceived(remoteMessage)

    Log.d("remoteMessage", "onMessageReceived: ${remoteMessage.data}")
    // playing audio and vibration when user se request
    val notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
    val r = RingtoneManager.getRingtone(this, notification)
    r.play()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        r.isLooping = false
    }

    val data: MutableMap<String, String> = remoteMessage.data
    val deviceId = data["username"]
    val deviceName = data["address"]
    val notificationType = data["notificationType"]


     //codes  
     ....
     ....



    val pendingIntent =
        PendingIntent.getActivity(this, 1, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT)
    builder.setContentTitle(remoteMessage.notification!!.title)
    builder.setContentText(remoteMessage.notification!!.body)
    builder.setContentIntent(pendingIntent)
    builder.setVibrate(longArrayOf(100, 300, 300, 300))
    builder.setStyle(
        NotificationCompat.BigTextStyle().bigText(
            remoteMessage.notification!!.body
        )
    )

    builder.setAutoCancel(true)
    mNotificationManager =
        applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channelId = "Your_channel_id"
        val channel = NotificationChannel(
            channelId,
            "Channel human readable title",
            NotificationManager.IMPORTANCE_DEFAULT
        )
        mNotificationManager!!.createNotificationChannel(channel)
        builder.setChannelId(channelId)
    }


    mNotificationManager!!.notify(System.currentTimeMillis().toInt(), builder.build())

    val cal = TimeStampConverter.getTimeStamp(remoteMessage.sentTime.toString())

    Log.d("OnReceivedNotification", "onMessageReceived:$remoteMessage ")


   // here i am calling helper class to upload data to 
   // server.....
    BackendServerHelperClass(applicationContext).saveNotification(
        System.currentTimeMillis().toInt(),
        remoteMessage.notification!!.title!!,
        remoteMessage.notification!!.body!!,
        FirebaseAuth.getInstance().uid.toString(),
        cal.time.toString(),
        deviceId,
        deviceName,
        isAllowedSubLetting.toBoolean(),
        notificationType!!.toInt()           )

 }
}

请帮助,如果有什么办法可以做到这一点。

已更新

我尝试授予屏幕覆盖权限,但仍然无法正常工作

帮助将不胜感激:) 谢谢

经过大量研究,我找到了解决方案。

如果我们想在后台接收通知,并希望在收到通知后在后台做一些其他事情,那么我们应该简单地发送 “数据” 部分而不是 “通知”部分。

如果我们同时发送 “数据”“通知” 那么我们将在后台收到通知,但如果您正在做一些"onMessageReceive" 中的其他内容,例如将数据保存到 ROOM DATABASE 或将一些数据上传到 SERVER。 , 那么你应该只发送 "数据" 部分。

数据部分示例:

{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
  "Nick" : "Mario",
  "body" : "great match!",
  "Room" : "PortugalVSDenmark"
  }
 }
}

这解决了我的问题。

您可以在官方 FCM 文档中阅读更多相关信息。

谢谢!!编码愉快:)