Xamarin iOS:从后台返回到前台后,iOS计时器是否继续在同一位置

时间:2017-06-15 23:30:18

标签: ios xamarin timer nstimer

我在AppDelegate内的FinishLaunching事件中有一个计时器,它被设置为每30分钟执行一次。 如果我将应用程序移动到后台或甚至被设备挂起,我知道Timer会停止,但如果它返回到前台会发生什么。定时器是否会从停止的地方继续。

E.g。从应用程序启动10分钟后,我切换到应用程序,直到它有背景/暂停。 10分钟后,我将其切换回来。计时器会在10分钟后开火还是重新开始(30分钟)。

   downloadTimer = NSTimer.CreateRepeatingScheduledTimer(30, DownloadEntityFromServer);

    NSRunLoop.Current.AddTimer(downloadTimer, NSRunLoopMode.Default);

1 个答案:

答案 0 :(得分:0)

如果应用程序暂停,计时器将不会停止。它将继续射击。 无法暂停和恢复计时器。请参考以下解决方法来暂停和恢复计时器。

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