{31 день с Mango} День 25: Фоновые агенты

Это День 25 в серии статей 31 день с Mango (перевод оригинальной серии 31 Days of Mango), и был написан приглашенным автором Гари Джонсон (Gary Johnson). Вы можете найти его в твиттере @GaryGJohnson.
Сегодня мы собираемся взглянуть на одну из возможностей многозадачности, новой для Windows Phone 7.5. Полная картина многозадачности состоит из нескольких новых функций:
— Фоновые агенты
— Фоновая передача файлов
— Фоновое воспроизведение аудиозаписей
— Запланированные уведомления
— Быстрое переключение между приложениями (FAS — Fast Application Switching)
В этой статье мы сосредоточимся на фоновых агентах. В то время как агенты фоновой передачи данных и воспроизведения аудиозаписей охватывают конкретные сценарии, они не позволяют выполнять собственный код. Для этого предназначены Фоновые агенты.
Есть два типа Фоновых агентов: Периодические и Ресурсоемкие. Ресурсоемкие агенты предназначены для задач, которые потребляют большое количество системных ресурсов, и имеют некоторые ограничения, когда они могут быть запущены. Периодические агентов могут запускаться чаще и с меньшим количеством ограничений, но предназначены для задач, которые потребляют мало ресурсов. Чтобы полностью понять различные ограничения и преимущества каждого из них, прочтите их описание на MSDN.
Периодическая задача может выполнить что-то краткое и простое, как например обновление канала RSS или обновление живой плитки. Ресурсоемкая задача может выполнить что-то, требующее много времени и большой пропускной способности интернет-канала, как например синхронизация или кэширование больших объемов данных из облачных сервисов.
В статье мы собираемся сделать Периодический агент, который будет обновлять живую плитку приложения информацией о моменте выполнения последней пользовательской задачи.

Приступаем к работе
Запустим Visual Studio и создадим новый проект. В разделе Silverlight for Windows Phone выбирем Windows Phone Application. Назовём его «MyAgentApp».

Мы создали основное приложение. Оно будет отвечать за две вещи:
1) Наличие живой плитки, на которой Фоновый агент будет обновлять информацию.
2) Запуск и остановка Фонового агента.
Фоновый агент должен находиться в собственном специальном проекте. Добавим новый проект в наше решение, выбрав Windows Phone Scheduled Task Agent. Назовем его MyAgent. Это проект, который будет содержать наш собственный код, который будет работать в фоновом режиме и обновить плитку.

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

<Tasks>
<DefaultTaskName=«_default«NavigationPage=«MainPage.xaml« />
<ExtendedTaskName=«BackgroundTask«>
<BackgroundServiceAgentSpecifier=«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 — это обязательное поле и появится в разделе Settings | Background Tasks под названием нашего приложения.

Создание Фонового агента
В проекте  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 и запустим приложение. Нажмём на кнопку, чтобы запустить фоновый агент. Выйдите из приложения и найдите его в списке приложений. Нажмите и удерживайте палец (или курсор в эмуляторе) на названии приложения и выбирете в открывшемся меню »на рабочий стол». При просмотре плитки на рабочем столе (стартовом экране), вы должны в конечном счете увидетьпри повороте оборотную сторону плитки, на которой отражается время последнего момента, когда она была обновлена.

Итоги
Итак, сегодня мы создали наш собственный Фоновый агент, который обновляет живую плитку. При самостоятельном создании Фоновых агентов имейте ввиду то, что мы рассмотрели в этой статье:
— Фоновые агенты позволяют выполнять собственный код, когда приложение не запущено
— Есть два типа Фоновых агента: Периодические и Ресурсоемкие
— Периодические задачи используются для решения задач, которые  имеют низкое потребление ресурсов, и в результате имеют меньше ограничений, чем ресурсоемкие задачи.
— Для Фонового агента нужен собственный проект, который должен быть добавлен в качестве проекта, ссылающегося на приложение, которое запускает агент.
— В вашем агенте нужно переопределить метод OnInvoke ()
— Если ваша задача выполнена необходимо вызвать метод NotifyComplete() или Abort().

Полный проект описанного в статье приложения доступен по следующей ссылке.

Перевод: Сергей Урусов

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *