Статьи

Как создать / отладить фоновую задачу в Windows 8 — часть 1

Наконец, после многих попыток я смог найти правильный способ создания, настройки и отладки фоновой задачи в Windows 8. Давайте сделаем небольшой шаг назад: как и в мире Windows Phone, приложения для Windows 8 могут ‘ не работает в фоновом режиме. Фактически они автоматически приостанавливаются через 10 секунд, когда приложение больше не находится на переднем плане. Чтобы преодолеть это ограничение, в Windows 8 были введены фоновые задачи, то есть операции, которые можно выполнять в фоновом режиме, когда критерий удовлетворен: истек таймер, получено push-уведомление, состояние компьютера изменилось и т. Д.

Концепция должна быть знакома разработчикам Windows Phone: в Windows Phone 7.5 появился аналогичный способ поддержки фоновых операций. Самое большое отличие состоит в том, что фоновые задачи Windows 8 являются более мощными: в Windows Phone есть только несколько категорий фоновых задач (в основном, основанных на событиях таймера), в то время как в Windows 8 вы можете создавать задачи, которые выполняются при выполнении множества различных условий. ,

Недостатком является то, что в Windows 8 фоновые задачи не так легко реализовать и отладить, в основном из-за отсутствия выделенного шаблона Visual Studio (в отличие от Windows Phone), поэтому немного сложно понять, как они работают.

Первое, что нужно иметь в виду, это то, что фоновая задача — это отдельный проект Visual Studio , который является частью того же решения, которое содержит основное приложение. Итак, первый шаг — создать новый проект, щелкнув правой кнопкой мыши по решению и выбрав Add — New project . Шаблон вы собираетесь использовать среды выполнения Windows Component , внутри Windows Store категории.

Важно использовать этот шаблон, потому что в этом случае тип вывода проекта будет автоматически установлен на компонент среды выполнения Windows (вы можете увидеть его в раскрывающемся списке в библиотеке типов вывода в свойствах проекта). Если вы используете тип другого проекта (например, Class Library ), фоновая задача не будет работать.

Теперь давайте перейдем к написанию некоторого кода: переименуйте класс, который автоматически создается с проектом, в более подходящее имя (например, NotificationTask ) и измените его так, чтобы он наследовал от интерфейса IBackgroundTask .

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

private void SendNotification(string text)
{
    XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);
 
    XmlNodeList elements = toastXml.GetElementsByTagName("text");
    foreach (IXmlNode node in elements)
    {
        node.InnerText = text;
    }
 
    ToastNotification notification = new ToastNotification(toastXml);
    ToastNotificationManager.CreateToastNotifier().Show(notification);
}

Используя ToastNotificationManager, мы получаем XML, который идентифицирует один из доступных шаблонов, и мы переходим к изменению текстового узла, который содержит текст уведомления. В конце мы создаем новый объект ToastNotification, используя обновленный шаблон, и снимаем его снова, используя ToastNotificationManager .

В методе Run мы просто будем вызывать этот метод, передавая ложный текст в качестве параметра:

public void Run(IBackgroundTaskInstance taskInstance)
{
    SendNotification("This is a toast notification");
}

Как видите, метод Run поставляется с объектом IBackgroundTaskInstance , который содержит всю информацию о текущей задаче. Этот параметр важен, особенно если мы собираемся написать асинхронный код, потому что с архитектурой, которую мы только что видели, задача завершится до завершения асинхронного кода.

По этой причине мы должны использовать объект BackgroundTaskDeferral , который мы можем получить из параметра taskInstance , как в следующем примере:

public async void Run(IBackgroundTaskInstance taskInstance)
{
    BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
 
    //we launch an async operation using the async / await pattern   
    await CheckNewItems();
 
    deferral.Complete();
}

Во- первых, мы получаем BackgroundTaskDeferral объект, вызвав GetDeferral metohod из taskInstance объекта. Затем мы выполняем наш асинхронный код (в этом примере мы вызываем поддельный метод, который проверяет, есть ли новые элементы для загрузки), а затем, в конце концов, когда все завершено, мы вызываем метод Complete для объекта BackgroundTaskDeferral .

Покажите мне немного любви клиента

Хорошо, пока мы видели, как создать фоновую задачу. Но как мы говорим клиенту (настоящему приложению Windows 8) использовать фоновую задачу? Есть два шага: первый — объявить задачу в манифесте. Дважды щелкните Package.appxmanifest , чтобы появился визуальный редактор, перейдите в раздел « Объявления » и добавьте объявление « Фоновые задачи» : мы собираемся установить два важных поля.

  • Первая — это тип фоновой задачи: в нашем примере мы будем использовать фоновые задачи таймера , которые могут выполняться периодически. Вам просто нужно проверить один из доступных вариантов.
  • Второй — полная точка входа фоновой задачи, которая представляет собой пространство имен плюс имя класса. Поскольку в нашем примере я создал класс NotificationTask внутри проекта с именем BackgroundTask.NotificationTask , точкой входа будет BackgroundTask.NotificationTask.NotificationTask .

Мы еще не закончили редактировать манифест: как вы можете видеть на изображении, после установки фоновой задачи на вкладке пользовательского интерфейса приложения появляется значок предупреждения (белый крестик над красной точкой) . Это происходит потому, что когда вы включаете фоновую задачу, тип которой — «Таймер», «Push-уведомление» или «Канал управления», вы вынуждены установить, какой тип уведомления о блокировке вы собираетесь использовать. Это необходимо, поскольку подобные фоновые задачи в основном используются для поддержки уведомлений на экране блокировки.

Для этого откройте вкладку «Интерфейс приложения» и:

  • Установите флажок Уведомления на экране блокировки, если вы собираетесь использовать отображение только значка (значок с номером) или вы также поддерживаете текст (например, приложение «Календарь», в котором отображается заголовок следующего назначения).
  • Включите значок для использования в качестве значка для уведомлений о блокировке. Это должен быть файл изображения с разрешением 24 × 24.

Последнее, что нужно сделать, это установить в разделе « Уведомления » параметр Toast, который может принимать значение «да», поскольку в фоновой задаче, которую мы создали, отображаются уведомления о тостах.

Пришло время написать код … почти

В следующем посте мы увидим, как зарегистрировать фоновую задачу в коде и как Visual Studio 2012 помогает нам в тестировании и отладке фоновой задачи.