我正在尝试根据 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 客户端项目中创建一个用于广播的接收器,例如:
[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中各个平台的native方法时,就可以使用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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句