几个月前我开始使用 xamarin,直到现在,我还不需要做这样的事情。我正在开发一个应用程序,该应用程序应该每天运行一次 WCF Web 服务并验证信息是否真实。如果是这样,它应该在设备上显示一条通知。我的问题是我不知道如何执行它,我已经阅读了有关后台和计划任务的信息,但我不太明白如何执行此操作。我如何使用 Xamarin.Forms 来做到这一点?
谢谢你!
对于 Android,解决方案需要 4 个组件:
AlarmManager设置每日检查时间表BroadCastReceiver接收每日触发器并调用 IntentServiceIntentService执行等待的调用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”
| 归档时间: |
|
| 查看次数: |
2470 次 |
| 最近记录: |