任务每天在 Xamarin Forms 上运行一次

F. *_*ado 3 xamarin.forms

几个月前我开始使用 xamarin,直到现在,我还不需要做这样的事情。我正在开发一个应用程序,该应用程序应该每天运行一次 WCF Web 服务并验证信息是否真实。如果是这样,它应该在设备上显示一条通知。我的问题是我不知道如何执行它,我已经阅读了有关后台和计划任务的信息,但我不太明白如何执行此操作。我如何使用 Xamarin.Forms 来做到这一点?

谢谢你!

Koe*_*oen 5

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

  1. AlarmManager设置每日检查时间表
  2. BroadCastReceiver接收每日触发器并调用 IntentService
  3. IntentService执行等待的调用
  4. 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); 
}
Run Code Online (Sandbox Code Playgroud)

BroadCastReceiver - 接收警报

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

其工作所需的权限是“RECEIVE_BOOT_COMPLETED”和“WAKE_LOCK”