Xamarin.forms 每天在Xamarin窗体上运行一次的任务
几个月前我开始使用xamarin,直到现在,我还没有必要做这样的事情。 我正在开发一个应用程序,每天运行一次WCF web服务,并验证信息是否真实。如果为真,则应在设备上显示通知。 我的问题是我不知道如何执行它,我读过背景知识和计划任务,但我不太明白如何执行它。我如何使用Xamarin.Forms实现它Xamarin.forms 每天在Xamarin窗体上运行一次的任务,xamarin.forms,Xamarin.forms,几个月前我开始使用xamarin,直到现在,我还没有必要做这样的事情。 我正在开发一个应用程序,每天运行一次WCF web服务,并验证信息是否真实。如果为真,则应在设备上显示通知。 我的问题是我不知道如何执行它,我读过背景知识和计划任务,但我不太明白如何执行它。我如何使用Xamarin.Forms实现它 谢谢大家! 对于Android,解决方案需要4个组件: AlarmManager设置每日检查计划 BroadCastReceiver接收每日触发器并调用IntentService IntentS
谢谢大家! 对于Android,解决方案需要4个组件:
AlarmManager
设置每日检查计划BroadCastReceiver
接收每日触发器并调用IntentServiceIntentService
执行等待调用OnBootReceiver
以确保在设备重新启动后再次设置报警以下是Android组件的一些示例代码: AlarmManager-设置报警
[assembly: Dependency(typeof(AlarmHelper))] // above the namespace
...
class AlarmHelper: IAlarm
{
var now = Calendar.Instance;
var alarmTime = Calendar.Instance;
alarmTime.Set(CalendarField.HourOfDay, settings.AlarmHour); // Set Alarm start Hour
alarmTime.Set(CalendarField.Minute, settings.AlarmMinutes); // Set Alarm Start Minutes
if (alarmTime.Before(now))
{
alarmTime.Add(CalendarField.Hour, 24);
}
var intent = new Intent(Android.App.Application.Context, typeof(ScheduledAlarmHandler));
var pendingIntent = PendingIntent.GetBroadcast(Android.App.Application.Context, 0, intent, PendingIntentFlags.CancelCurrent);
var alarmManager = Android.App.Application.Context.GetSystemService(Context.AlarmService) as AlarmManager;
alarmManager.SetRepeating(AlarmType.RtcWakeup, alarmTime.TimeInMillis, AlarmManager.IntervalDay, pendingIntent);
}
[BroadcastReceiver]
class ScheduledAlarmHandler : WakefulBroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Console.WriteLine("ScheduledAlarmHandler", "Starting service @" + SystemClock.ElapsedRealtime());
Intent service = new Intent(context, typeof(WakefulAPIService));
StartWakefulService(context, service);
}
}
广播接收器-接收警报
[assembly: Dependency(typeof(AlarmHelper))] // above the namespace
...
class AlarmHelper: IAlarm
{
var now = Calendar.Instance;
var alarmTime = Calendar.Instance;
alarmTime.Set(CalendarField.HourOfDay, settings.AlarmHour); // Set Alarm start Hour
alarmTime.Set(CalendarField.Minute, settings.AlarmMinutes); // Set Alarm Start Minutes
if (alarmTime.Before(now))
{
alarmTime.Add(CalendarField.Hour, 24);
}
var intent = new Intent(Android.App.Application.Context, typeof(ScheduledAlarmHandler));
var pendingIntent = PendingIntent.GetBroadcast(Android.App.Application.Context, 0, intent, PendingIntentFlags.CancelCurrent);
var alarmManager = Android.App.Application.Context.GetSystemService(Context.AlarmService) as AlarmManager;
alarmManager.SetRepeating(AlarmType.RtcWakeup, alarmTime.TimeInMillis, AlarmManager.IntervalDay, pendingIntent);
}
[BroadcastReceiver]
class ScheduledAlarmHandler : WakefulBroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Console.WriteLine("ScheduledAlarmHandler", "Starting service @" + SystemClock.ElapsedRealtime());
Intent service = new Intent(context, typeof(WakefulAPIService));
StartWakefulService(context, service);
}
}
IntentService-执行等待的呼叫
[Service]
[IntentFilter(new String[] { "com.test.testApp.WakefulAPIService" })]
class WakefulAPIService : IntentService
{
protected override void OnHandleIntent(Intent intent)
{
// Your API Call code here
Console.WriteLine("WakefulAPIService", "Completed service @ " + SystemClock.ElapsedRealtime());
Android.Support.V4.Content.WakefulBroadcastReceiver.CompleteWakefulIntent(intent);
}
}
OnBootReceiver-确保在设备重新启动后再次设置报警
[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { "android.intent.action.BOOT_COMPLETED", "android.intent.action.QUICKBOOT_POWERON" })]
class OnBootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Console.WriteLine("On Boot Reveiver", "Alarm Set Again after Reboot");
var alarmHelper = new AlarmHelper();
alarmHelper.SetAlarm();
}
}
此操作所需的权限是“接收启动完成”和“唤醒锁定”在本例中,对于您可以使用的Android,请参阅此类
[Service(Name = "com.xamarin.samples.downloadscheduler.DownloadJob",
Permission = "android.permission.BIND_JOB_SERVICE")]
public class DownloadJob : JobService
{
public override bool OnStartJob(JobParameters jobParams)
{
Task.Run(() =>
{
//Your periodic task here
});
return true;
}
public override bool OnStopJob(JobParameters jobParams)
{
//true so we re-schedule the task
return true;
}
}
然后您可以创建一个工厂来调用此服务
public static class ReadLocationSchedulerFactory
{
public static JobInfo.Builder CreateJobBuilderUsingJobId<T>(this Context context, int jobId) where T : JobService
{
var javaClass = Java.Lang.Class.FromType(typeof(T));
var componentName = new ComponentName(context, javaClass);
return new JobInfo.Builder(jobId, componentName);
}
}
公共静态类ReadLocationSchedulerFactory
{
public static JobInfo.Builder CreateJobBuilderSingJobId(此上下文,int jobId),其中T:JobService
{
var javaClass=Java.Lang.Class.FromType(typeof(T));
var componentName=新的componentName(上下文,javaClass);
返回新的JobInfo.Builder(jobId,componentName);
}
}
然后在你的主要活动中,你必须给工厂打电话
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App172S.App());
#region Scheduler
var jobBuilder = this.CreateJobBuilderUsingJobId<ReadLocationScheduler>(152);
//This means each 20 mins
jobBuilder.SetPeriodic(20 * 60 * 1000);
//Persists over phone restarts
jobBuilder.SetPersisted(true);
//If Fails re-try each 2 mins
jobBuilder.SetBackoffCriteria(120 * 1000, BackoffPolicy.Linear);
var jobInfo = jobBuilder.Build();
var jobScheduler = (JobScheduler)GetSystemService(JobSchedulerService);
jobScheduler.Cancel(152);
var scheduleResult = jobScheduler.Schedule(jobInfo);
if (JobScheduler.ResultSuccess == scheduleResult)
{
//If OK maybe show a msg
}
else
{
//If Failed do something
}
#endregion
}
protectedoverride void OnCreate(捆绑包)
{
base.OnCreate(bundle);
全局::Xamarin.Forms.Forms.Init(这个,bundle);
LoadApplication(新的App172S.App());
#区域调度器
var jobBuilder=this.CreateJobBuilderUsingJobId(152);
//这意味着每20分钟
jobBuilder.SetPeriodic(20*60*1000);
//通过电话重新启动
jobBuilder.SetPersisted(true);
//如果失败,请每2分钟重试一次
jobBuilder.Setbackoff标准(120*1000,BackoffPolicy.Linear);
var jobInfo=jobBuilder.Build();
var jobScheduler=(jobScheduler)GetSystemService(JobSchedulerService);
jobScheduler.Cancel(152);
var scheduleResult=jobScheduler.Schedule(jobInfo);
if(JobScheduler.ResultSuccess==schedulesult)
{
//如果确定,可能会显示一个消息
}
其他的
{
//如果失败了,做点什么
}
#端区
}
google“ios/android计划任务”、“dependencyservice”不是每次创建MainActivity
时都会更新作业吗?换句话说,如果我想让作业在12:00,12:20运行。。。我在12:10打开应用程序,作业配置更改为12:10、12:30运行。。。?