Наконец, после многих попыток я смог найти правильный способ создания, настройки и отладки фоновой задачи в 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 помогает нам в тестировании и отладке фоновой задачи.