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 
      } 
     } 
} 
+0

如果没有设置,会发生什么与计时器。 – LittleFunny

+0

@LittleFunny我修改了内容。你可以试试这个吗?在此代码中,当应用程序在10分钟内暂停并且应用程序恢复时,该事件将在20分钟内触发,而不是30分钟。 – VenkyDhana

+0

我认为Temporary Timer Tick方法应该调用DownloadEntityFromServer,然后调用NSTimer.CreateRepeatingScheduledTimer。 – LittleFunny