Xamarin.forms 每天在Xamarin窗体上运行一次的任务

Xamarin.forms 每天在Xamarin窗体上运行一次的任务,xamarin.forms,Xamarin.forms,几个月前我开始使用xamarin,直到现在,我还没有必要做这样的事情。 我正在开发一个应用程序,每天运行一次WCF web服务,并验证信息是否真实。如果为真,则应在设备上显示通知。 我的问题是我不知道如何执行它,我读过背景知识和计划任务,但我不太明白如何执行它。我如何使用Xamarin.Forms实现它 谢谢大家! 对于Android,解决方案需要4个组件: AlarmManager设置每日检查计划 BroadCastReceiver接收每日触发器并调用IntentService IntentS

几个月前我开始使用xamarin,直到现在,我还没有必要做这样的事情。 我正在开发一个应用程序,每天运行一次WCF web服务,并验证信息是否真实。如果为真,则应在设备上显示通知。 我的问题是我不知道如何执行它,我读过背景知识和计划任务,但我不太明白如何执行它。我如何使用Xamarin.Forms实现它


谢谢大家!

对于Android,解决方案需要4个组件:

  • AlarmManager
    设置每日检查计划
  • BroadCastReceiver
    接收每日触发器并调用IntentService
  • IntentService
    执行等待调用
  • OnBootReceiver
    以确保在设备重新启动后再次设置报警
  • 对于iOS,您很可能需要远程推送通知


    以下是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运行。。。?