当您收到来自 GCM 的推送通知并且您的应用程序未运行时插入数据

Instert data when you receive a push notification from GCM and your app was not runing

我正确收到来自 GCM 的通知,但我想将该消息插入本地 (sqlite) 数据库。

如果我的应用程序不是 运行 时收到通知,它不会插入消息,但如果我的应用程序是 运行,它就会插入。

void SendNotification (string message)
{
    var intent = new Intent (this, typeof(MainActivity));
    intent.AddFlags (ActivityFlags.ClearTop);
    var pendingIntent = PendingIntent.GetActivity (this, 0, intent, PendingIntentFlags.OneShot);

    var notificationBuilder = new Notification.Builder (this)
        .SetSmallIcon (Resource.Drawable.icstatbutton_click)
        .SetContentTitle ("GCM Message")
        .SetContentText ("U heeft een nieuwe vragenlijst.")
        .SetAutoCancel (true)
        .SetContentIntent (pendingIntent);

    var notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);
    notificationManager.Notify (0, notificationBuilder.Build());

    try
    {
        DataAccess.InsertDownload (message);
    }
    catch (Exception ex)
    {

    }
}

当我的应用程序不是 运行 时,我可以访问 sqlite 数据库吗?

是的。当应用程序不是 运行 时,您可以访问 Sqlite。在 Activity 的 OnCreate 中,您可以检查新消息并进行相应更新。

你的 DataAccess.InsertDownload() 方法在你的共享代码中吗?如果是这样,这就是我 运行 喜欢的东西。

可能不是解决它的最佳方法,但我所做的是将 JSON 字符串保存到 Android 的 SharedPreferences 中(如果应用程序实际上已关闭)。然后在 MainActivity 内再次加载应用程序,在加载共享项目后,我尝试读取任何 SharedPreferences 并将它们保存到数据库中。

下面是一些显示此内容的代码。 Here 是 link 到 SettingsImplementation

public async Task SaveNotifToDb(Notification notification) {
    try {
        DataAccess.InsertDownload (message); 
    } catch(System.InvalidOperationException) { //InvalidOperationException is the exception given when your shared code is not yet loaded, meaning the app is closed, so now lets save to Preferences
        System.Console.WriteLine("\nIn APP.Droid.Helpers.GcmService.SaveNotificationAsync() - InvalidOperationException, the app is probably closed. Saving to Shared Preferences\n");

        string notificationJson = Newtonsoft.Json.JsonConvert.SerializeObject(notification);

        string emptyCheck = SettingsImplementation.GetValueOrDefault<string>(DroidConstants.NotificationSettingKeyPart + "0", DroidConstants.NotificationSettingDefault);

        if(emptyCheck.Length > 0) {

            int index = 0;

            while(emptyCheck.Length > 0) {
                emptyCheck = SettingsImplementation.GetValueOrDefault<string>(DroidConstants.NotificationSettingKeyPart + index.ToString(), DroidConstants.NotificationSettingDefault);
                index ++;
            }

            SettingsImplementation.AddOrUpdateValue<string>(DroidConstants.NotificationSettingKeyPart + (index - 1).ToString(), notificationJson);
        } else { SettingsImplementation.AddOrUpdateValue<string>(DroidConstants.NotificationSettingKeyPart + "0", notificationJson); }

        return notification;
    }
}

现在,当应用程序启动时,我们等待共享代码加载,然后尝试读取所有通知 JSON 退出。

MainActivity.OnCreate():

base.OnCreate(bundle);
Xamarin.Forms.Forms.Init(this, bundle);

string notificationJson = SettingsImplementation.GetValueOrDefault(DroidConstants.NotificationSettingKeyPart + "0", DroidConstants.NotificationSettingDefault); //Check to see if we have a saved notification

    if(notificationJson.Length > 0) {

        int index = 0;

        while(notificationJson.Length > 0) { //Keep trying until no more notifications can be gatherd
            notificationJson = SettingsImplementation.GetValueOrDefault(DroidConstants.NotificationSettingKeyPart + index, DroidConstants.NotificationSettingDefault);

            if(notificationJson.Length > 0) {

                Data.Models.RemoteNotification notification = Newtonsoft.Json.JsonConvert.DeserializeObject<Data.Models.RemoteNotification>(notificationJson);

                if(notification != null) {

                    try {
                        await App.RemoteNotificationRepo.InsertAsync(notification);
                    } catch(System.Exception e) {
                        System.Console.WriteLine("\nIn APP.Droid.MainActivity.OnCreate() - Exception attempting to create new in app notification\n{0}\n", e);
                    }
                }

                 SettingsImplementation.Remove(DroidConstants.NotificationSettingKeyPart + index.ToString());

                 index++;
            }
        }
    }