繁体   English   中英

使用系统日期安排本地通知并在不启动应用程序的情况下进行通知(Xamarin.Forms)

[英]Scheduling a local Notification with System Date and notifies without launching the App (Xamarin.Forms)

我正在尝试根据SQLite中设置的时间安排本地通知,因此我在此链接中使用了某个库:

本地通知库

我已经很好地实现了,但是仍然面临以下问题:

a)仅当我启动该应用程序时,才发出通知。

b)所有通知时间都通知一次,并将其存储在SQLite中。

现在,我如何才能使该应用程序捕获系统时间(电话时间),并且像警报一样通知您,甚至不启动该应用程序

我是否应该使用以下方法之一:

i)睡眠

ii)OnResume等或...

所以下面是我将代码放置在App.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using Diabetes.localDB;
using Diabetes.Main;
using Newtonsoft.Json;
using Plugin.Notifications;
using Xamarin.Forms;

namespace Diabetes
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            // Setting the Alarm time 
            MedicationDatabase db = new MedicationDatabase();
            //Getting  list of time set in SQlite.
            var alarm_list = db.GetAlarmList();

            // Looping each time to make an alarm
            foreach (var alarm in alarm_list)
            {
                try
                {

                    Debug.WriteLine("Date Time Format : " + alarm);

                //This is the library to set Notifications, Date is where the time is attached.
                    CrossNotifications.Current.Send(new Notification
                    {
                        Title = "Hola! ",
                        Message = "Hey  Eddy I remind you take insulin, this is the time you told me to remind you.",
                        Vibrate = true,
                        Sound = "pop",
                        Date = DateTime.Parse(alarm)

                    });
                }
                catch (FormatException v)
                {
                    Debug.WriteLine("Format Exception : " + v);
                }
                catch (OverflowException c)
                {
                    Debug.WriteLine("Overflow Exception : " + c);
                }


            }

            MainPage = new NavigationPage(new Login())

            {
                BarBackgroundColor = Color.FromHex("#66C8F3"),
                BarTextColor = Color.White,
                Title = "Diabetics App"


            };
        }

        protected override void OnStart()
        {


        }



        protected override void OnSleep()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
        }





    }
}

现在,我如何才能使该应用程序捕获系统时间(电话时间),并且像警报一样通知您,甚至不启动该应用程序

您可以使用Android.App.AlarmManager ,此类提供对系统警报服务的访问。 这些使您可以计划您的应用程序在将来的某个时间运行。 警报响起时,系统会广播已为其注册的意图,并在目标应用程序尚未运行时自动启动它。

由于您使用XF进行开发,因此,首先,您应该能够创建要在Android Client Project中广播的接收器,例如:

[BroadcastReceiver]
public class AlarmReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        var message = intent.GetStringExtra("message");
        var title = intent.GetStringExtra("title");

        var resultIntent = new Intent(context, typeof(MainActivity));
        resultIntent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);

        var pending = PendingIntent.GetActivity(context, 0,
            resultIntent,
            PendingIntentFlags.CancelCurrent);

        var builder =
            new Notification.Builder(context)
                .SetContentTitle(title)
                .SetContentText(message)
                .SetSmallIcon(Resource.Drawable.Icon)
                .SetDefaults(NotificationDefaults.All);

        builder.SetContentIntent(pending);

        var notification = builder.Build();

        var manager = NotificationManager.FromContext(context);
        manager.Notify(10010, notification);
    }
}

然后在XF中,当我们需要使用PCL中每个平台的本机方法时,可以使用DependencyService来实现它。

在PCL中,创建如下界面:

public interface ISetAlarm
{
    void SetAlarm(int hour, int minute);
}

然后,在Android客户端项目中,例如如下实现该接口:

[assembly: Xamarin.Forms.Dependency(typeof(SetAlarmImplementation))]
namespace YOURNAMESPACE.Droid
{
    public class SetAlarmImplementation : ISetAlarm
    {
        public void SetAlarm(int hour, int minute)
        {
            Intent myintent = new Intent(Xamarin.Forms.Forms.Context, typeof(AlarmReceiver));
            var pendingintent = PendingIntent.GetBroadcast(Xamarin.Forms.Forms.Context, 0, myintent, PendingIntentFlags.UpdateCurrent);

            Java.Util.Date date = new Java.Util.Date();
            Java.Util.Calendar cal = Java.Util.Calendar.Instance;
            cal.TimeInMillis = Java.Lang.JavaSystem.CurrentTimeMillis();
            cal.Set(Java.Util.CalendarField.HourOfDay, hour);
            cal.Set(Java.Util.CalendarField.Minute, minute);
            cal.Set(Java.Util.CalendarField.Second, 0);

            AlarmManager alarmManager = Xamarin.Forms.Forms.Context.GetSystemService(Android.Content.Context.AlarmService) as AlarmManager;
            alarmManager.Set(AlarmType.RtcWakeup, cal.TimeInMillis, pendingintent);
        }
    }
}

最后,当您想从PCL调用它时,可以这样调用它:

DependencyService.Get<ISetAlarm>().SetAlarm(13, 30);  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM