app墓碑后如何运行秒表?

时间:2016-05-02 22:07:52

标签: c# windows-phone-8.1 background-process lifecycle stopwatch

问题:

我已经实现了Stopwatch运行,并将值添加到实时磁贴中。但是当我墓碑或关闭应用程序时,秒表会停止运行。

因此,这会产生一个问题,即应用程序关闭后,秒表的经过时间的初始值仅更新为实时图块。

问题:

我想知道当应用程序被杀死时可以使用哪些选项来运行秒表,并随后使用更新的秒表值定期调用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);

    }


}

1 个答案:

答案 0 :(得分:1)

如果您希望在应用关闭后保留它,可以在静态变量或文件中保存您的开始时间。我建议使用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存储到文件中的一种非常简单(并且在我看来很方便)的方式。还有其他方法可以做到这一点,但对于某些事情,这个简单的纯文本很高兴看到出现问题。