当应用程序不在前台时,如何在 Windows Universal 中获得正确的时间间隔?

Posted

技术标签:

【中文标题】当应用程序不在前台时,如何在 Windows Universal 中获得正确的时间间隔?【英文标题】:How to get a correct time interval in windows universal when the app is not in foreground? 【发布时间】:2016-09-08 04:37:23 【问题描述】:

我需要检查应用程序是否在 15 分钟前打开。如果我为此选择一个后台任务,windows 不保证该任务不会被杀死。有没有办法获得独立于系统时间的时间戳?就像在 android 中一样,我们可以在启动后获取时间,可以在这里轻松使用。 我正在开发一个 win 10 应用程序(C#)。

【问题讨论】:

你想在 15 分钟后运行什么任务? 我想检查一个标志(存储在数据库中)是否为真。 为什么不在应用设置中保存当前时间,然后在恢复/启动时检查当前时间并与保存的值进行比较? 【参考方案1】:

我建议您使用 DispatcherTimer 类,该类在 MSDN 上有很好的文档,并提供了一个很好的示例。您创建一个DateTimeOffset startTime; 作为全局变量。然后,您每 30 秒创建一个 Tick 事件来验证经过的时间:

DateTimeOffset time = DateTimeOffset.Now;
TimeSpan span = time - startTime;

创建 Tick 事件的所有细节都在我为DispatcherTimer 提供的链接上有详细记录。

【讨论】:

你确定我可以用这个吗?我的应用可能不在前台,我不想以当地时间作为参考,因为有人可能会手动更改它。 我很确定即使应用程序不在前台也能正常工作,但您可以使用更小的间隔(10 秒而不是 30 秒,1 分钟而不是 15 分钟)来测试它。此外,您只需验证当前时间是否小于事件 30 秒前的时间,即可检测此人是否更改了本地时间。 我刚刚用我的应用测试了!调度程序计时器和事件仍然在后台工作!您提到的问题是正确的,可以更改 PC 时间并相应地影响 DispatcherTimer。但是,您只能在 PC 上更改分钟,因此如果您执行一个每 15 秒检查一次时间的事件,那么您可以轻松检测到此人是否作弊。 好的,我刚刚明白了,即使关闭应用也需要查看时间!这是不同的。检查此站点“msdn.microsoft.com/en-us/windows/uwp/launch-resume/…”,以及以前关于 DispatcherTimer 的文档。 否 - 这在手机上不起作用 - 一旦进入后台,您的应用程序将迅速暂停 - 在调试中它会起作用,因此 lifecycle events are not triggered automatically。【参考方案2】:

TickCount 是我用来解决这个问题的。这给出了自启动以来的毫秒数。

【讨论】:

以上是关于当应用程序不在前台时,如何在 Windows Universal 中获得正确的时间间隔?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序不在前台时,特定活动不会从通知单击打开(应用程序是最近的,没有被杀死!)

Flutter:当我的应用不在前台时如何显示横幅(如地图/谷歌地图)?

当 Windows (phone) 8.1 应用程序在前台时接收并处理通知参数

如何在前台运行 Windows 任务?

不在前台时位置服务被杀死

android 如何实现后台时用通知栏显示有新的消息,当在前台时不显示通知