如何运行 app墓碑后秒表?

How to run stopwatch after app tombstone?

问题:

我已经实现了 Stopwatch,其中 运行s 和值被添加到动态磁贴中。但是当我删除或关闭应用程序时,秒表停止 运行ning。

所以这会出现一个问题,即秒表经过时间的初始值仅在应用程序关闭后更新到动态磁贴。

问题:

我想知道当应用程序被终止并随后使用更新的秒表值定期调用 CreateLiveTile 方法时,运行 秒表可以使用哪些选项?

我之前没有尝试过此类功能,因此我正在寻找有关此平台为实现该功能所必须提供的功能的一些反馈。

代码:

这本质上是 运行 秒表的代码和单独的方法 CreateLiveTile(),它以经过的时间作为参数创建一个新的动态磁贴:

    private async Task ShowTimerConfirmationDialog()
    {
         //Set timer for current parking tag
         SetParkingTagTimer();

         //Create the live tile
         CreateLiveTile();

    }


    private void SetParkingTagTimer()
    {

        //set timer to current elapsed time
        StopWatch.Start();
        // Get the elapsed time as a TimeSpan value.
        var ts = (SelectedParkDuration ?? StopWatch.Elapsed) - StopWatch.Elapsed;

        // Format and display the TimeSpan value. 
        ElapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
    }

    private void CreateLiveTile()
    {
        var tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquare150x150PeekImageAndText01);

        var tileImage = tileXml.GetElementsByTagName("image")[0] as XmlElement;
        tileImage.SetAttribute("src", "ms-appx:///Assets/Logo.scale-140.png");

        var tileText = tileXml.GetElementsByTagName("text");
        (tileText[2] as XmlElement).InnerText = "Time remaining:";
        (tileText[3] as XmlElement).InnerText = " " + ElapsedTime;

        var tileNotification = new TileNotification(tileXml);
        TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification);

    }


}

如果您希望它在应用程序关闭后仍然存在,您可以将开始时间保存在静态变量或文件中。我建议使用 DateTime 结构。

这是一个极其简化的例子

private static DateTime startTime;
private const string START_TIME_FILENAME = "./your/path.txt"

public static void StartStopWatch()
{
    // Persist this variable until the app is closed
    startTime = DateTime.Now;

    //Persist this variable until it is overwritten
    System.IO.File.WriteAllText(START_TIME_FILENAME, startTime.ToString());
}

// Get the difference in time since you started the stopwatch and now
public static TimeSpan Elapsed()
{
    if (startTime == null)
    {
        startTime = GetStartTime();
    }

    return DateTime.Now - startTime;
}

// Call this method to get the start time after the app has been closed
private static DateTime GetStartTime()
{
    return Convert.ToDateTime(System.IO.File.ReadAllText(START_TIME_FILENAME));
}

为了即使在应用程序关闭后也能跟踪计时器的启动时间,您必须将变量保存到硬盘。

此外,这只是一种将 DateTime 存储到文件的非常简单(而且在我看来很方便)的方法。还有其他方法可以做到这一点,但对于某些事情来说,这个简单的纯文本很好看,以防出现问题。