I have this kotlin application. It’s sole purpose is to test if the FCM notifications are received (so the most basic setup here) The problem I have and cannot get a root cause for this is that it takes me multiple times of starting / restarting / stopping the application (and android studio as well), to see on the emulator (Pixel 8 Pro) that indeed those notifications are received. And they really do (the app is in the background for this) and they are received every time once it works, but as I said it takes multiple times of restarting app / android studio and I cannot come to a conclusion what is exactly the case here, and why on first run of the application, then background it, send notification it does not receive those. Any help there? I am not a kotlin / android dev, I just want to test the integration from the backend service that sends those notifications. NOTE: for testing this I am using google console messaging to send notifications.
MainActivity.kt
package com.example.notification_sandbox
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.notification_sandbox.ui.theme.Notification_sandboxTheme
import com.google.android.gms.tasks.OnCompleteListener
import com.google.firebase.FirebaseApp
import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.messaging.RemoteMessage
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
FirebaseApp.initializeApp(this)
enableEdgeToEdge()
setContent {
Notification_sandboxTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "Android",
modifier = Modifier.padding(innerPadding)
)
}
}
}
FirebaseMessaging.getInstance().token.addOnCompleteListener(
OnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w(
TAG,
"Fetching FCM registration token failed",
task.exception
)
return@OnCompleteListener
}
// Get new FCM registration token
val token = task.result
// Log and toast
val msg = getString(R.string.msg_token_fmt, token)
Log.d(TAG, msg)
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})
}
companion object {
private const val TAG = "MainActivity"
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
Notification_sandboxTheme {
Greeting("Android")
}
}
Then a service that handles notifications:
package com.example.notification_sandbox
import android.util.Log
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage) {
// Handle FCM messages here
Log.d(TAG, "From: ${remoteMessage.from}")
// Check if the message contains data
remoteMessage.data.isNotEmpty().let {
Log.d(TAG, "Message data payload: " + remoteMessage.data)
}
// Check if the message contains a notification payload
remoteMessage.notification?.let {
Log.d(TAG, "Message Notification Body: ${it.body}")
}
}
override fun onNewToken(token: String) {
// Handle new or refreshed FCM registration token
Log.d(TAG, "Refreshed token: $token")
// You may want to send this token to your server for further use
}
override fun onCreate() {
Log.d(TAG, "started!!!")
}
companion object {
private const val TAG = "MyFirebaseMsgService"
}
}
2