firebase / firebase/quickstart-android

FCM background notifications do not trigger custom Analytics event

Open
#2,663 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Kotlin
Stars
9.3k
Forks
7.4k
Avg merge
2d 19h
Merged PRs (30d)
8

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

1. Create a subclass of `FirebaseMessagingService` (e.g., `MyFirebaseMessagingService`) that overrides `onMessageReceived`.
2. In `onMessageReceived`, log a custom event using `FirebaseAnalytics.logEvent(...)` when a data payload is present.
3. Send an FCM message from the Firebase Console or a server with both `notification` and `data` payloads.
4. Put the app in the background.
5. 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

```kotlin
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)
}
}

Contributor guide

Open the contributing guide

Research direction

Start with MyFirebaseMessagingService.onMessageReceived and compare the notification and data payload behavior described in the reproduction steps. Check the Firebase Messaging background-delivery and Analytics upload documentation, then verify whether the reported event appears after the app returns to the foreground. Done requires a confirmed cause or a clearer, reproducible quickstart issue.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, firebase, kotlin
Domain
mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.