Статьи

31 Дней Манго | День № 25: Фоновые агенты

Эта статья является Днем № 25 из серии под названием « 31 день манго» и была написана приглашенным автором Гари Джонсоном. С Гэри можно связаться в Твиттере по адресу @GaryGJohnson .

Day25-BackgroundAgents

Сегодня мы рассмотрим одну из возможностей многозадачности, новую для Windows Phone 7.5. Полная картина многозадачности состоит из нескольких новых функций:

  • Фоновые агенты
  • Фоновая передача файлов
  • Фоновое воспроизведение звука
  • Запланированные уведомления
  • Быстрое переключение приложений

Здесь мы сосредоточимся на фоновых агентах. Хотя задачи передачи файлов и воспроизведения аудио охватывают определенные сценарии, они не позволяют выполнять пользовательский код. Вот где вступают фоновые агенты.

Существует два типа фоновых агентов: периодические и ресурсоемкие . Ресурсные интенсивные агенты предназначены для задач, которые потребляют большое количество системных ресурсов и имеют несколько ограничений на время их запуска. Периодические агенты запускаются чаще и с меньшими ограничениями, но предназначены для задач, которые потребляют мало ресурсов. Чтобы полностью понять различные ограничения и преимущества каждого из них, обратитесь к странице MSDN .

Периодическая задача может сделать что-то короткое и простое, например, обновить RSS-канал или обновить вашу живую плитку. Ресурсоемкая задача может выполнять что-то, что требует много времени и пропускной способности, например, синхронизировать или кэшировать большие объемы данных из облачной службы.

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

Начиная

Запустите Visual Studio и создайте новый проект. Под Silverlight для Windows Phone выберите Приложение для Windows Phone . Назовите это «MyAgentApp».

clip_image002

Вы создали главное приложение. Он будет отвечать за две вещи:

1) Наличие живой плитки, которую фоновый агент может обновлять информацией

2) Запуск и остановка фонового агента

Сам фоновый агент должен жить в своем собственном специальном проекте. Добавьте новый проект в свое решение, выбрав Windows Phone Scheduled Task Agent . Назовите это MyAgent . Этот проект будет содержать ваш собственный код, который будет работать в фоновом режиме и обновлять живую плитку.

clip_image004

Наконец, и это важно, перейдите в проект MyAgentApp и добавьте ссылку на проект в MyAgent . Это позволит вам зарегистрировать своего агента из приложения. Также обратите внимание на запись, которая автоматически создается в WMAppManifest.xml:

<Tasks>
      <DefaultTask Name="_default" NavigationPage="MainPage.xaml" />
      <ExtendedTask Name="BackgroundTask">
        <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="MyAgent" Source="MyAgent" Type="MyAgent.ScheduledAgent" />
      </ExtendedTask>
    </Tasks>

Создание приложения

Теперь пришло время на самом деле подключить все. Откройте MainPage.xaml и добавьте две кнопки, одну для запуска агента, а другую для его остановки:

<StackPanel VerticalAlignment="Center">
        <Button Content="Start Background Agent"
               Click="StartButton_Click"/>
        <Button Content="Stop Background Agent"
               Click="StopButton_Click"/> 
    </StackPanel>

В файле MainPage.xaml.cs соедините кнопки для запуска и остановки агента:

private const string TASK_NAME = "MyAgent";

private void StartButton_Click(object sender, RoutedEventArgs e)
{
    StartAgent();
}

private void StopButton_Click(object sender, RoutedEventArgs e)
{
    StopAgentIfStarted();
}

private void StartAgent()
{
    StopAgentIfStarted();

    PeriodicTask task = new PeriodicTask(TASK_NAME);
    task.Description = "This is our custom agent for Day 25 - Background Agents";
    ScheduledActionService.Add(task);
#if DEBUG
    // If we're debugging, attempt to start the task immediately
    ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1));
#endif
}

private void StopAgentIfStarted()
{
    if (ScheduledActionService.Find(TASK_NAME) != null)
    {
        ScheduledActionService.Remove(TASK_NAME);
    }
}

Обратите внимание, что для создания нашего пользовательского агента мы создаем новую PeriodicTask . Затем мы используем имя в качестве идентификатора при поиске и остановке агента. Также обратите внимание, что мы указали PeriodicTask.Description — это обязательное поле, которое появится в меню «Настройки» | Основные задачи под названием нашего приложения.

Создайте фоновый агент

В проекте MyAgent откройте ScheduledAgent.cs и добавьте следующий код:

protected override void OnInvoke(ScheduledTask task)
{
    UpdateAppTile(GetLastUpdatedTimeMessage());
}

private string GetLastUpdatedTimeMessage()
{
    return string.Format("Last Updated: {0}", DateTime.Now);
}

private void UpdateAppTile(string message)
{
    ShellTile appTile = ShellTile.ActiveTiles.First();
    if (appTile != null)
    {
        StandardTileData tileData = new StandardTileData
        {
            BackContent = message
        };

        appTile.Update(tileData);
    }
} 

ScheduledAgent имеет один важный метод для переопределения — OnInvoke . Здесь ваш агент выполнит свою фоновую задачу. Если ваша задача выполнена и вам больше не нужен агент для запуска, вы можете вызвать NotifyComplete (), чтобы сообщить об успешном завершении задачи, или Abort (), чтобы указать, что вы отменяете свою задачу. Чтобы задание выполнялось с интервалом, просто не звоните, что мы и делаем здесь.

Запуск приложения

Теперь, когда наше приложение готово к работе, разверните его на эмуляторе устройства или Windows Phone и запустите приложение. Нажмите кнопку, чтобы запустить фоновый агент. Оставьте заявку и найдите ее в списке приложений. Нажмите и удерживайте приложение и выберите «Pin to Start». Когда вы просматриваете плитку на своей стартовой странице, вы в конечном итоге увидите, как плитка приложения переворачивается, показывая время последнего обновления.

clip_image005

Резюме

Итак, сегодня мы создали наш собственный фоновый агент, который обновляет живую плитку. Создавая собственные фоновые агенты, помните, что мы рассмотрели:

  • Фоновые агенты позволяют выполнять пользовательский код, пока ваше приложение не запущено
  • Существует два типа фоновых агентов — периодические и ресурсные.
  • Периодические задачи предназначены для задач с низким потреблением ресурсов и, как следствие, имеют меньше ограничений, чем задачи с интенсивным использованием ресурсов.
  • Фоновым агентам нужен собственный проект, который должен быть добавлен в качестве ссылки на проект приложения, которое запустит агент.
  • В вашем агенте вам нужно переопределить OnInvoke ()
  • Когда ваша задача завершена, вам нужно вызвать NotifyComplete () или Abort ()

Чтобы загрузить полный проект Windows Phone, который использует весь код и концепции, описанные выше, нажмите кнопку «Загрузить код» ниже:

скачать

Завтра мы рассмотрим другую функцию многозадачности, которая называется Фоновая передача файлов , которая позволит нам загружать или загружать файлы, когда наше приложение не запущено. Увидимся позже!

toolsbutton

Источник:
http://www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/