Open
Description
Description
I am trying to log a custom Analytics event from onMessageReceived
in my FirebaseMessagingService
when a background notification is delivered. However, the custom event is never showing up in Firebase DebugView or the Analytics dashboard. I suspect that onMessageReceived
is not being called in the background or that the payload might not be set up correctly. I’d like help diagnosing why the custom event is not appearing.
Step 1: Describe your environment
- Android device: Pixel 5 (example)
- Android OS version: 12 (example)
- Google Play Services version: 22.12.13 (example)
- Firebase/Play Services SDK version:
- Firebase Messaging: 23.0.0
- Firebase Analytics: 21.2.0
(examples—replace with your actual versions)
Step 2: Describe the problem
Steps to reproduce
- Create a subclass of
FirebaseMessagingService
(e.g.,MyFirebaseMessagingService
) that overridesonMessageReceived
. - In
onMessageReceived
, log a custom event usingFirebaseAnalytics.logEvent(...)
when a data payload is present. - Send an FCM message from the Firebase Console or a server with both
notification
anddata
payloads. - Put the app in the background.
- Wait for the notification to arrive, then check Firebase DebugView for the custom event.
Observed Results
- The
onMessageReceived
method seems to run when the app is in the foreground (and the custom event appears in DebugView). - When the app is in the background, the custom event (
notification_received_background
) never appears in DebugView or in the Analytics dashboard. - It appears that
onMessageReceived
is not being triggered, or the event is not being uploaded in the background.
Expected Results
- Even if the notification is received while the app is in the background, the custom event (
notification_received_background
) should be logged and appear in DebugView (after the app comes to the foreground to upload events).
Relevant Code
package com.example.myapplication
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.core.app.NotificationCompat
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import com.example.myapplication.extension.isAppInForeground
class MyFirebaseMessagingService : FirebaseMessagingService() {
private val firebaseAnalytics: FirebaseAnalytics by lazy {
Firebase.analytics
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
// Log data payload
if (remoteMessage.data.isNotEmpty()) {
Log.d("FirebaseMessagingService", "Data payload: ${remoteMessage.data}")
// Log custom event
logEventToFirebase("notification_received_background", "Android", "google.com")
}
val isInForeground = applicationContext.isAppInForeground()
if (isInForeground) {
logEventToFirebase("notification_user_foreground", "Android", "google.com")
}
// Show a local notification
showNotification(remoteMessage, "Android", "google.com")
}
override fun onNewToken(token: String) {
super.onNewToken(token)
Log.d("FCM", "New FCM Token: $token")
}
private fun showNotification(
remoteMessage: RemoteMessage,
operatorName: String,
subDomain: String
) {
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channelId = "default_channel"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
channelId,
"Default Channel",
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManager.createNotificationChannel(channel)
}
val tapIntent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra("operator_name", operatorName)
putExtra("sub_domain", subDomain)
}
val pendingTapIntent = PendingIntent.getActivity(
this, 0, tapIntent, PendingIntent.FLAG_IMMUTABLE
)
val dismissIntent = Intent(this, NotificationDismissReceiver::class.java)
val pendingDismissIntent = PendingIntent.getBroadcast(
this, 1, dismissIntent, PendingIntent.FLAG_IMMUTABLE
)
val builder = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(remoteMessage.data["title"] ?: "Title")
.setContentText(remoteMessage.data["body"] ?: "Body")
.setContentIntent(pendingTapIntent)
.setDeleteIntent(pendingDismissIntent)
.setAutoCancel(true)
notificationManager.notify(0, builder.build())
}
private fun logEventToFirebase(eventName: String, operatorName: String, subDomain: String) {
val params = Bundle().apply {
putString("operator_name", operatorName)
putString("sub_domain", subDomain)
}
firebaseAnalytics.logEvent(eventName, params)
}
}
Metadata
Metadata
Assignees
Labels
No labels