Xamarin Android: FCM Push notification handling on terminated app: key to the success

If you have ever tried to make an app, that handles a specific type of push notification differently than just simply show a notification to the user, you may have found yourself in trouble. To handle notification receive in a terminated app state, you have to send the payload differently than normal cases.

You should send data only push with high priority to be able to handle the notification by yourself in your app.

The following example shows a perfect payload for Android with FireBase Admin SDK for C#:

			var data = new Dictionary<string, string>();
			data.Add("MessageType", "UrgentNotification");
			data.Add("Title", "Hello Xamarin.Android");
			data.Add("Content", "This notification has been handled by the app");

			FirebaseAdmin.Messaging.Message Message = new FirebaseAdmin.Messaging.Message()
			{
				Token = token,
				Data = data,
				Android = new FirebaseAdmin.Messaging.AndroidConfig()
				{
					Priority = FirebaseAdmin.Messaging.Priority.High,
					Data = data
				}
			};

As you see in the example, the Notification property is completely missing from the payload. But how to handle this notification on the client side? Here’s the solution:

First thing first: Make soure you’re able to receive notifications foreground.
Add google-services.json, make sure the bundlename matches the setting in firebase, etc, etc.

Derive from FirebaseMessagingService

You should make a service, derived from FirebaseMessagingService with an intentfilter to be able to catch Messaging events.

	[Service]
	[IntentFilter(new string[] { "com.google.firebase.MESSAGING_EVENT" })]
	public class MyFirebaseMessagingService : FirebaseMessagingService

OnMessageReceived will be triggered when the application is terminated or it is in foreground. But not even in debug mode. You need to set the build config to release, in order to receive messages when your app is killed by the user. You can display local notification from the data passed as parameter array like this:

if (data?.ContainsKey("UrgentNotification") == true)
			{
				var intent = new Intent(this, typeof(MainActivity));
				intent.AddFlags(ActivityFlags.ClearTop);
				foreach (var key in data.Keys)
				{
					intent.PutExtra(key, data[key]);
				}



				var pendingIntent = PendingIntent.GetActivity(this,
															  MainActivity.NOTIFICATION_ID,
															  intent,
															  PendingIntentFlags.OneShot);

				var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
										  .SetSmallIcon(Resource.Drawable.common_google_signin_btn_icon_light_normal)
										  .SetContentTitle("FCM Message")
										  .SetContentText(messageBody ?? "DATA ONLY")
										  .SetAutoCancel(true)
										  .SetContentIntent(pendingIntent);

				notificationManager.Notify(MainActivity.NOTIFICATION_ID, notificationBuilder.Build()); 
			}

Or start an activity. (Works only below Android 10):

var startActivityIntent = new Intent(this, typeof(MainActivity));
					startActivityIntent.SetAction("ACTION_VIEW");
					startActivityIntent.SetFlags(ActivityFlags.NewTask);

					StartActivity(startActivityIntent);
This content has 4 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.