Как запустить секундомер после захоронения приложения?

Проблема:

Я реализовал 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);

    }


}

person Brian J    schedule 02.05.2016    source источник
comment
Вы должны создать фоновую задачу. Обратитесь к этому sanathwindowsdev.blogspot.in/2014/ 11/   -  person Archana    schedule 03.05.2016


Ответы (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 в файл. Есть и другие способы сделать это, но для чего-то этот простой простой текст приятно видеть, если что-то пойдет не так.

person Andrew Bonsall    schedule 03.05.2016
comment
Хотя сохранение значения таймера кажется хорошей идеей, мне также нужна фоновая служба, которая должна периодически вызывать CreateLiveTile() и обновлять информацию о времени, прошедшем с момента закрытия приложения. - person Brian J; 04.05.2016
comment
Мои знания о Windows Phone 8.1 ограничены, поэтому дайте мне знать, если у вас не получится это сделать, но не можете ли вы просто прочитать файл из фоновой службы? - person Andrew Bonsall; 04.05.2016
comment
На самом деле, вот ссылка на StackOverflow, которая отвечает, как вы можете обмениваться данными между вашим приложением и фоновой службой в Windows Phone 8.1. Похоже, вам нужно будет использовать базу данных или, как я уже сказал, сохранить время начала в файл. http://stackoverflow.com/questions/11390084/share-data-between-main-app-and-periodic-task - person Andrew Bonsall; 04.05.2016
comment
Хорошо, я начал с фоновой задачи, так что это должно решить ее. - person Brian J; 07.05.2016