-1

I want to store the firebase push notification into sqlite when the app in any state like app is closed/background/foreground. How can i do this? Is it possible to do this?

3 Answers3

1

In your FirebaseMessagingService inheriting class you have two important methods that you can use for this:

For Foreground notifications:

This method is called when your application is in foreground state

public override void OnMessageReceived(RemoteMessage message)
    {
       // SQLite saving code here 
    }

And For Background and Killed state notifications:

This method is called when your application is in background/killed state

 public override void HandleIntent(Intent p0)
    {
       base.HandleIntent(p0);
       // SQLite saving code here 
    }

Note: that in certain cases this function is also called in foreground notifications that might cause duplication.

FreakyAli
  • 13,349
  • 3
  • 23
  • 63
  • Fine. But here how can i get notification content like "var getBody = message.GetNotification().Body;" – Mohanasundharam Mar 01 '19 at 12:38
  • If you check the parameter intent which comes in this method it has the Extras property i.e. `p0.Extras` which is an `Android.OS.Bundle` and you can get the Data in it using the `GetString` method just pass in the relevant keys which you can find when you debug this property – FreakyAli Mar 01 '19 at 12:47
  • Well basically you will have to debug this property and find your message in it – FreakyAli Mar 01 '19 at 13:12
  • Check [this](https://learn.microsoft.com/en-us/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=windows#handle-notification-intents) – FreakyAli Mar 01 '19 at 13:28
  • Well, in that case, you will have to create custom notifications: https://stackoverflow.com/a/40728153/7462031 once you do this all your notifications will call the OnMessageReceived method – FreakyAli Mar 01 '19 at 13:41
  • Thank you Mr.Hakim, I completed this part successfully! – Mohanasundharam Mar 01 '19 at 17:08
0

When you are getting your notification in OnMessageReceived method, check app state using this method

private bool isApplicationInTheBackground()
{
    bool isInBackground;

    RunningAppProcessInfo myProcess = new RunningAppProcessInfo();
    ActivityManager.GetMyMemoryState(myProcess);
    isInBackground = myProcess.Importance != Android.App.Importance.background;

    return isInBackground;
}

If your app in background state, fetch notification information from OnMessageReceived and insert that in desired table

public override void OnMessageReceived(RemoteMessage message)
{
    string orgId;
    var data = message.Data.ToDictionary(i => i.Key, i => i.Value);
    if (data.ContainsKey("organization"))
        orgId = data["organization"];


    if(isApplicationInTheBackground())
    {
        var db = GetCon();
        db.Insert(orgId); //here should be your table.
    }
}

And when you want to send/deliver saved notifications use local android push notifications.

R15
  • 13,982
  • 14
  • 97
  • 173
0

here is the final solution for this problem, thanks to Mr.G.hakim

public override void OnMessageReceived(RemoteMessage message)
    {
        Log.Debug(TAG, "From: " + message.From);
        Log.Debug(TAG, "Notification Message Body: " + getBody);
        SendNotification(getBody, message.Data);
    }

    public override void HandleIntent(Intent p0)// this method will fire when the app in background and closed state
    {
        base.HandleIntent(p0);
        if (p0.Extras != null)
        {
            foreach (var key in p0.Extras.KeySet())
            {
                var value = p0.Extras.GetString(key);
                Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
                if(key== "gcm.notification.title")
                {
                    Log.Debug("Delay Notification Title", "" + value);
                    getBGTitle = value;//declared local variable
                }
                else if(key== "gcm.notification.body")
                {
                    Log.Debug("Delay Notification Body", "" + value);
                    getBGBody = value;//declared local variable
        insertData(getBGTitle,getBGBody)//call method for store SQLite Insert
                }
            }
        }
}