Xamarin iOS:从后台返回到前台后,iOS定时器是否继续在同一个地点
问题描述:
我在设置为每30分钟执行一次的AppDelegate内的FinishLaunching事件中有一个定时器。 如果我将应用程序移动到背景或者甚至被设备暂停,我明白Timer将停止,但是如果它返回到前景将会发生什么。计时器是否会继续停止。Xamarin iOS:从后台返回到前台后,iOS定时器是否继续在同一个地点
E.g.从应用程序启动后10分钟后,我切换到应用程序,直到它处于后台/暂停状态。 10分钟后,我将它切换回来。计时器会在10分钟后再次启动或重新启动(30分钟)。
downloadTimer = NSTimer.CreateRepeatingScheduledTimer(30, DownloadEntityFromServer);
NSRunLoop.Current.AddTimer(downloadTimer, NSRunLoopMode.Default);
答
如果应用程序暂停,计时器将不会停止。它会继续射击。 无法暂停和恢复定时器。相反,请参考下面的解决方法暂停和恢复计时器。
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
NSTimer downloadTimer;
DateTime date;
TimeSpan RemainingMinutes;
bool isBackground;
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
downloadTimer = NSTimer.CreateRepeatingScheduledTimer(new TimeSpan(0,30,0), DownloadEntityFromServer);
NSRunLoop.Current.AddTimer(downloadTimer, NSRunLoopMode.Default);
return base.FinishedLaunching(app, options);
}
public override void DidEnterBackground(UIApplication uiApplication)
{
RemainingMinutes = (DateTime.Now - date);
isBackground = true;
base.DidEnterBackground(uiApplication);
}
public override void WillEnterForeground(UIApplication uiApplication)
{
isBackground = false;
CreateTemporaryTimer();
base.WillEnterForeground(uiApplication);
}
void CreateTemporaryTimer()
{
NSTimer tempTimer = NSTimer.CreateScheduledTimer(new TimeSpan(0,30-RemainingMinutes.Minutes,0), TemporaryTimerTicks);
}
void TemporaryTimerTicks(NSTimer obj)
{
downloadTimer.Invalidate();
downloadTimer = NSTimer.CreateRepeatingScheduledTimer(new TimeSpan(0,30,0), DownloadEntityFromServer);
}
void DownloadEntityFromServer(NSTimer obj)
{
date = DateTime.Now;
if (!isBackground)
{
// Write your stuff
}
}
}
如果没有设置,会发生什么与计时器。 – LittleFunny
@LittleFunny我修改了内容。你可以试试这个吗?在此代码中,当应用程序在10分钟内暂停并且应用程序恢复时,该事件将在20分钟内触发,而不是30分钟。 – VenkyDhana
我认为Temporary Timer Tick方法应该调用DownloadEntityFromServer,然后调用NSTimer.CreateRepeatingScheduledTimer。 – LittleFunny