Search code examples
c#androidxamarin.androidandroid-pendingintentandroid-launcher

Pending Intent Extras are not set for Launcher Application


I have created a Launcher application named HomeActivity which has a LaunchMode = SingleTask and CATEGORY_HOME and CATEGORY_LAUNCHER. This activity in turn starts new activities and some other applications as well.

The activity is connected with a Firebase Messaging service to get Push notifications. The Firebase service adds some extras (gathered from the push notification and sends them in Extras in HomeActivity

public override void OnMessageReceived(RemoteMessage message)
{
    Notification.Builder builder = new Notification.Builder(this);
    builder.SetSmallIcon(Resource.Drawable.Icon);
    Intent intent = new Intent(this, typeof(HomeActivity));
    intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);    
    intent.PutExtra(General.UPDATE_NOTIFIED, true);
    if(message.Data != null)
    {
        if (message.Data.Any())
        {
            foreach(KeyValuePair<string,string> kv in message.Data)
            {
                intent.PutExtra(kv.Key, kv.Value);
            }
        }
    }
    PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.UpdateCurrent);
    builder.SetContentIntent(pendingIntent);
    builder.SetLargeIcon(BitmapFactory.DecodeResource(Resources, Resource.Drawable.app_logo));
    builder.SetContentTitle(message.GetNotification().Title);
    builder.SetContentText(message.GetNotification().Body);
    builder.SetDefaults(NotificationDefaults.Sound);
    builder.SetAutoCancel(true);
    NotificationManager notificationManager = (NotificationManager)GetSystemService(NotificationService);
    notificationManager.Notify(1, builder.Build());
}

Whenever the HomeActivity is on top and a push notification is received and clicked, I can access the Extras in HomeActivity's OnResume function (I have overriden OnNewIntent(Intent intent)).

protected override void OnNewIntent(Intent intent)
{
    bool updateNotification = intent.GetBooleanExtra(General.UPDATE_NOTIFIED, false); //Check if Extra is set
    this.Intent = intent;
    base.OnNewIntent(intent);    
}

But when I am in another activity which is launched by the HomeActivity and a Push notification is clicked; the app does return to the HomeActivity but there are no Extras in the Intent.

I have tried all sorts of Flags, including but not limited to NewTask, ClearTask as well.

I am still unable to get why the Extras aren't being set when the notification is clicked at the time another activity is in place. What am I missing here.


Solution

  • Ok so I figured out what the issue is.

    The Firebase system WILL NOT fire the OnMessageReceived method if you post a Notification with data (That is a display message).

    What is needed to be done is that only data payload in the push notification will fire the OnMessageRecieved function which is responsible for setting the data.

    So the notification should be like

    {
        to: "topic | Registered device",
        data:{
              data1: "data_value1",
              data2: "data_value2",
              data3: "data_value3",
        }
    }