Статьи

EvenTiles от начала до конца — часть 12

В предыдущем выпуске этой серии о том, как разработать приложение для Windows Phone с нуля, мы говорили об отладке PeriodicTask . Прежде чем углубляться в обмен данными между приложением и его PeriodicTask, нам нужно немного поговорить о планировании PeriodicTask и об истечении срока PeriodicTask.

Возвращаясь к 10-й части серии EvenTiles , PeriodicTask был создан внутри файла MainPage.xaml.cs в методе StartPeriodicAgent. Этот закрытый метод заботится об остановке текущего активного агента перед созданием нового. Он также обрабатывает исключение, которое может возникать при попытке запуска новой PeriodicTask, когда пользователь отключил фоновую обработку для приложения EvenTiles, что он может сделать из настроек телефона.

Тем не менее, после отправки EvenTiles в Marketplace, я заметил исключительно высокое число сбоев в приложении (как вы можете видеть из моей панели инструментов AppHub). Поскольку я хочу поделиться всеми подробностями о разработке этого приложения, а также о жизненном цикле приложения, было бы справедливо поделиться количеством сбоев на сегодняшний день, которым я не горжусь.

образ

Начнем с того, что первая версия EvenTiles называется LaunchForTest в режиме выпуска, что приводит к исключению, которое отображается в стеке вызовов при различных инцидентах сбоя. Кроме того, приложение не рассчитывает на другие приложения, использующие фоновые агенты на конкретном устройстве. Для сохранения памяти, но в основном заряда батареи устройства, количество фоновых агентов, которые могут работать одновременно, ограничено. Он варьируется в зависимости от аппаратных возможностей устройства и может отличаться для разных устройств, но это небольшое число, и поэтому этот предел может быть легко достигнут. Когда этот предел достигнут, SchedulerServiceExceptionбудет брошено всякий раз, когда вы пытаетесь добавить периодическое задание. Конечно, вы в значительной степени обрабатываете это исключение, чтобы предотвратить сбой приложения, поскольку вы добавляете периодическое задание изнутри приложения.

Таким образом, для создания периодической задачи следует использовать следующий код (который является расширением кода, который мы использовали в части 10 серии ):

Правильно добавить агента:

    private void StartPeriodicAgent()
    {
        RemovePeriodicAgent();
     
        var evenTilesPeriodicTask = new PeriodicTask(evenTilesPeriodicTaskName);
        evenTilesPeriodicTask.Description = "EvenTilesPeriodicTask";
     
        try
        {
            ScheduledActionService.Add(evenTilesPeriodicTask);
    #if DEBUG_TASK
            ScheduledActionService.LaunchForTest(evenTilesPeriodicTaskName, TimeSpan.FromSeconds(30));
    #endif
            App.PeriodicTaskScheduled = true;
        }
        catch (InvalidOperationException ex)
        {
            if (ex.Message.Contains("BNS Error: The action is disabled"))
            {
                MessageBox.Show("Background agents for this application are disabled.");
            }
        }
        catch (SchedulerServiceException)
        {
            MessageBox.Show("Can't schedule your background agent. There might be too many background agents enabled. You can disable background agents through the phone's settings application.");
        }
    }

Если вы посмотрите, как создается периодическая задача, вы также увидите, что для
App.PeriodicTaskScheduled установлено значение
true . Это статическое свойство поддерживается в файле App.xaml.cs, его значение сохраняется / извлекается из
IsolatedStorageSettings (
см. Часть 5 EvenTiles для получения дополнительной информации).

Причина добавления этого логического свойства состоит в том, чтобы узнать, запланировало ли приложение задачу PeriodicTask. Если для приложения был добавлен PeriodicTask, вы должны понимать, что PeriodicTask устареет и в конечном итоге истечет, если приложение не будет перенесено. Срок действия Периодической Задачи истечет, если он не был перенесен на 14 дней с того времени, когда был запланирован. Поскольку приложение отвечает за добавление PeriodicTask, это означает, что PeriodicTask будет продолжать работать только в том случае, если приложение активируется не реже одного раза в две недели и если приложение обязательно перепланирует PeriodicTask. Подход, который использует EvenTiles прямо сейчас, заключается в проверке того, был ли запланирован периодический период. Если это так, он будет перенесен, как только будет создана MainPage EvenTiles.

ПРИМЕЧАНИЕ. Мы могли бы использовать другой способ определения того, запланирован ли периодический запрос, например, путем проверки наличия в настоящее время вторичного тайла на начальном экране.

Используя IsolatedStorageSettings, мы добавим логику в файл app.xaml.cs для правильного хранения и извлечения свойства App.PeriodicTaskScheduled при запуске, активации, деактивации и завершении приложения.

Для начала в app.xaml.cs создаются новое свойство и новая константная строка для определения значения в IsoloatedStorageSettings следующим образом:

public const string keyPTScheduled = "K_PTS";
     
public static bool PeriodicTaskScheduled { get; set; }

В конструкторе свойство PeriodicTaskScheduled явно инициализируется как false . Наконец, значение PeriodicTaskScheduled сохраняется / извлекается в различных событиях жизненного цикла приложения:

Сохранение / получение значения свойства:

// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private void Application_Launching(object sender, LaunchingEventArgs e)
{
   if (appSettings.Contains(keyPTScheduled))
   {
        PeriodicTaskScheduled = (bool)appSettings[keyPTScheduled];
    }
 
    if (!appSettings.Contains(keyActSecBackContent))
    {
        appSettings[keyActSecBackContent] = DefaultSecBackContent;
    }
    ActualSecBackContent = (string)appSettings[keyActSecBackContent];
}
 
// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated(object sender, ActivatedEventArgs e)
{
    if (!e.IsApplicationInstancePreserved)
    {
        PeriodicTaskScheduled = (bool)appSettings[keyPTScheduled];
        ActualSecBackContent = (string)appSettings[keyActSecBackContent];
    }
}
     
// Code to execute when the application is deactivated (sent to background)
// This code will not execute when the application is closing
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
    appSettings[keyPTScheduled] = PeriodicTaskScheduled;
    appSettings[keyActSecBackContent] = ActualSecBackContent;
}
 
// Code to execute when the application is closing (eg, user hit Back)
// This code will not execute when the application is deactivated
private void Application_Closing(object sender, ClosingEventArgs e)
{
    appSettings[keyPTScheduled] = PeriodicTaskScheduled;
    appSettings[keyActSecBackContent] = ActualSecBackContent;
}

Наконец, мы будем использовать это свойство внутри файла MainPage.xaml.cs при создании страницы, чтобы определить, нужно ли нам перепланировать PeriodicTask:

Перепланирование периодической задачи?

public MainPage()
{
    InitializeComponent();
    if (App.PeriodicTaskScheduled)
    {
        StartPeriodicAgent();
    }
}

Каждый раз, когда PeriodicTask запланирован, App.PeriodicTaskProperty устанавливается в значение true, и создается Вторичная плитка. Если Вторичный Плитка удалена, App.PeriodicTaskProperty также устанавливается в false .

В следующем видео показано, как изменить существующий проект EvenTiles, чтобы улучшить способ планирования PeriodicTask, а также функции, необходимые для перепланирования PeriodicTask:

Если вы хотите взглянуть на исходный код, который у нас имеется для EvenTiles, вы можете загрузить все решение, относящееся к этому эпизоду:

Скачать исходный код EvenTiles Episode 12

После загрузки и разархивирования примера кода вы можете открыть решение EvenTiles в Visual Studio 2010 Express для Windows Phone. Для этого в вашей системе разработки должен быть установлен Windows Phone SDK 7.1 . Если у вас есть телефон, разблокированный разработчиком, вы можете развернуть приложение на своем телефоне, если у вас нет телефона, разблокированного разработчиком, вы все равно можете поэкспериментировать с этим приложением внутри эмулятора.

EvenTilesЕсли вы хотите, чтобы EvenTiles уже работали на вашем Windows Phone, вы также можете установить последнюю версию из Marketplace. Помните, что это приложение не должно быть чрезвычайно полезным, хотя оно содержит аналогичные функции, которые есть у «серьезных» приложений. Просто получите бесплатную копию EvenTiles в Marketplace по следующему адресу : http://www.windowsphone.com/en-US/search?q=EvenTiles (или найдите на телефоне EvenTiles в приложении Marketplace).

Когда EvenTiles перейдет к части 13, вы узнаете, как обмениваться данными между приложением и его фоновым агентом.

 


Источник: http://mstruys.com/2012/01/05/eventiles-from-start-to-finishpart-12/