Доступ к датчикам и устройствам из фоновой задачи

DeviceUseTrigger позволяет приложению UWP получать доступ к датчикам и периферийным устройствам в фоновом режиме даже тогда, когда приложение переднего плана приостановлено. Например, в зависимости от того, где выполняется приложение, оно может использовать фоновую задачу, чтобы синхронизировать данные с устройством или отслеживать показания датчиков. Чтобы сохранить уровень заряда и обеспечить соответствующее согласие пользователя, использование DeviceUseTrigger регулируется политиками, описанными в этой теме.

Для доступа к датчикам или периферийным устройствам в фоновом режиме создайте фоновую задачу, которая использует DeviceUseTrigger. Пример выполнения на ПК см. в разделе Пример настраиваемого устройства USB. Пример для телефона см. в разделе Пример фоновых датчиков.

Важно!

DeviceUseTrigger не может использоваться с фоновыми задачами в одном процессе. Информация в этом разделе относится только к фоновым задачам, которые выполняются в отдельном процессе.

Обзор фоновой задачи устройства

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

Примечание В универсальном приложении для Windows синхронизация устройства в фоновом режиме требует, чтобы пользователь одобрил фоновую синхронизацию вашим приложением. Устройство также должно быть подключено к компьютеру с активным вводом-выводом, и на устройстве должно быть разрешено до 10 минут фоновой активности. Подробнее о применении политики рассказывается ниже в этом разделе.

Ограничение: критические операции с устройством

Некоторые критические операции с устройством, например длительные обновления встроенного ПО, не могут выполняться с помощью класса DeviceUseTrigger. Такие операции могут выполняться только на компьютере и только привилегированным приложением, которое использует DeviceServicingTrigger. Привилегированным называется приложение, которому изготовитель устройства разрешил выполнять эти операции. Метаданные устройства позволяют указать, какое приложение (при его наличии) было назначено в качестве привилегированного приложения на устройстве. Подробнее: Синхронизация и обновление устройства с приложениями для устройства из Microsoft Store.

Протоколы и API, поддерживаемые в фоновой задаче DeviceUseTrigger

Фоновые задачи, использующие DeviceUseTrigger, позволяют приложению устанавливать связь по множеству протоколов и API, большинство из которых не поддерживается фоновыми задачами, запущенными системой. В универсальном приложении для Windows поддерживаются следующие протоколы и API.

Протокол DeviceUseTrigger в универсальном приложении для Windows
USB этот протокол поддерживается.
HID этот протокол поддерживается.
Bluetooth RFCOMM этот протокол поддерживается.
Bluetooth GATT этот протокол поддерживается.
MTP этот протокол поддерживается.
Проводная сеть этот протокол поддерживается.
Сеть Wi-Fi этот протокол поддерживается.
IDeviceIOControl deviceservicingtrigger поддерживает ideviceiocontrol
API датчиков deviceservicingtrigger поддерживает универсальные API датчиков (только датчики в семействе универсальных устройств)

Регистрация фоновых задач в манифесте пакета приложения

Приложение будет выполнять операции синхронизации и обновления в коде, который входит в фоновую задачу. Код внедрен в класс среды выполнения Windows, который реализует интерфейс IBackgroundTask (или на специальной странице JavaScript для приложений на JavaScript). Для использования фоновой задачи DeviceUseTrigger приложение должно объявить ее в файле манифеста приложения на переднем плане — как с фоновыми задачами, которые активируются системой.

В этом примере для файла манифеста пакета приложения DeviceLibrary.SyncContent является точкой входа для фоновой задачи, которая использует класс DeviceUseTrigger.

<Extensions>
  <Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.SyncContent">
    <BackgroundTasks>
      <m2:Task Type="deviceUse" />
    </BackgroundTasks>
  </Extension>
</Extensions>

Введение в использование DeviceUseTrigger

Для использования класса DeviceUseTrigger выполните следующие основные шаги. Подробнее об использовании фоновых задач: Поддержка приложения с помощью фоновых задач.

  1. Приложение регистрирует фоновую задачу в манифесте приложения и внедряет код фоновой задачи в класс среды выполнения Windows, который реализует IBackgroundTask, или на специальную страницу JavaScript для приложений на JavaScript.
  2. При запуске приложение создаст и настроит объект триггера с типом DeviceUseTrigger и сохранит экземпляр триггера для использования в будущем.
  3. Приложение проверяет предварительную регистрацию фоновой задачи и при необходимости регистрирует ее по триггеру. Обратите внимание, что приложению не разрешено задавать условия для задачи, связанной с этим триггером.
  4. Если приложению необходимо активировать фоновую задачу, сначала оно должно вызвать метод RequestAccessAsync, чтобы проверить, может ли приложение запросить фоновую задачу.
  5. Если приложение может запросить фоновую задачу, оно вызывает метод активации RequestAsync в объекте триггера на устройстве.
  6. Фоновая задача не регулируется, как другие системные фоновые задачи (нет квоты на время ЦП), но выполняется со сниженным приоритетом, чтобы сохранить скорость реагирования приложений на переднем плане.
  7. Затем Windows проверит, соблюдены ли необходимые политики в зависимости от типа триггера, включая запрос согласия пользователя на операцию до запуска фоновой задачи.
  8. Windows отслеживает системные условия и среду выполнения задачи и при необходимости отменяет задачу, если требуемые условия перестают выполняться.
  9. Когда фоновая задача сообщит о ходе выполнения или завершении, приложение получит эти события посредством событий выполнения и завершения зарегистрированной задачи.

Важно При использовании DeviceUseTrigger учитывайте следующие важные моменты:

  • Возможность программного запуска фоновых задач, использующих DeviceUseTrigger, была впервые реализована в Windows 8.1 и Windows Phone 8.1.

  • Определенные политики применяются системой Windows для получения согласия пользователя при обновлении периферийных устройств на компьютере.

  • Дополнительные политики применяются для сохранения уровня заряда батареи при синхронизации и обновлении периферийных устройств.

  • Windows может отменить фоновые задачи, использующие класс DeviceUseTrigger, когда перестают выполняться определенные требования политики, включая максимальное количество фонового времени (времени по часам). Эти требования политики важно учитывать при использовании фоновых задач для взаимодействия с периферийным устройством.

Совет Чтобы узнать, как работают эти фоновые задачи, скачайте пример. Пример выполнения на ПК см. в разделе Пример настраиваемого устройства USB. Пример для телефона см. в разделе Пример фоновых датчиков.  

Ограничения частоты и выполнения на переднем плане

Ограничения на частоту, с которой приложение может запускать операции, отсутствуют, но приложение может выполнять только одну операцию фоновой задачи DeviceUseTrigger единовременно (это не влияет на другие типы фоновых задач) и может инициировать фоновую задачу, только когда приложение выполняется на переднем плане. Когда приложение выполняется не на переднем плане, оно не может инициировать фоновую задачу с помощью класса DeviceUseTrigger. Приложение не может инициировать вторую фоновую задачу DeviceUseTrigger, пока не завершится первая.

Ограничения устройств

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

Из одной фоновой задачи DeviceUseTrigger приложение может получить доступ к любому числу периферийных устройств или датчиков, ограниченному только поддерживаемыми API и протоколами, указанными в предыдущей таблице.

Политики фоновых задач

Windows применяет политики, когда приложение использует фоновую задачу DeviceUseTrigger. Если политики не соблюдаются, фоновая задача может быть отменена. Эти требования политики важно учитывать, когда данный тип фоновой задачи используется для взаимодействия с устройствами или датчиками.

Политики инициирования задач

В таблице указаны политики инициирования задач, применимые к универсальному приложению для Windows.

Политика DeviceUseTrigger в универсальном приложении для Windows
Во время активации фоновой задачи приложение выполняется на переднем плане. политика применяется
Устройство подключено к системе (или находится в пределах досягаемости для беспроводного устройства). политика применяется
Устройство доступно приложению, использующему поддерживаемые периферийные API устройства (API среды выполнения Windows для USB, HID, Bluetooth, датчиков и т. д.). Если приложение не может получить доступ к устройству или датчику, в доступе к фоновой задаче будет отказано. политика применяется
Точка входа в фоновую задачу, предоставленная приложением, регистрируется в манифесте пакета приложения. политика применяется
Выполняется только одна фоновая задача DeviceUseTrigger на приложение. политика применяется
Еще не достигнуто максимальное число фоновых задач DeviceUseTrigger на устройстве (на котором выполняется приложение). Семейство настольных устройств. Можно регистрировать и выполнять параллельно неограниченное количество задач. Семейство мобильных устройств: 1 задача на устройстве с памятью объемом 512 МБ, либо параллельно могут быть зарегистрированы и запущены 2 задачи.
Максимальное число периферийных устройств или датчиков, доступных приложению из одной фоновой задачи DeviceUseTrigger при использовании поддерживаемых API или протоколов. без ограничений
Ваша фоновая задача расходует 400 мс времени ЦП (для 1 ГГц ЦП) каждую минуту, когда экран заблокирован, или каждые 5 минут, когда экран не заблокирован. Нарушение этой политики может привести к отмене задачи. политика применяется

Проверки политики среды выполнения

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

В таблице указаны политики среды выполнения, применимые к универсальному приложению для Windows.

Проверка политики DeviceUseTrigger в универсальном приложении для Windows
Устройство подключено к системе (или находится в пределах досягаемости для беспроводного устройства). проверка политики применяется
Задача выполняет обычный ввод-вывод на устройстве (1 ввод-вывод каждые 5 секунд). проверка политики применяется
Приложение не отменило задачу. проверка политики применяется
Ограничение времени по часам — общее количество времени, в течение которого задача приложения может выполняться в фоновом режиме. Семейство настольных устройств: 10 минут. Семейство мобильных устройств: нет ограничений по времени. Чтобы сохранить ресурсы, одновременно могут выполняться не более 1 или 2 задач.
Приложение не завершило работу. проверка политики применяется

Рекомендации

Ниже приводятся рекомендации для приложений, которые используют фоновые задачи DeviceUseTrigger.

Программирование фоновой задачи

Использование фоновой задачи DeviceUseTrigger в приложении позволяет любым операциям синхронизации или отслеживания, запускаемым в приложении на переднем плане, продолжать работу в фоновом режиме, если пользователи переключают приложения и ваше приложение на переднем плане приостанавливается системой Windows. Мы рекомендуем следовать такой общей модели для регистрации, инициирования и отмены регистрации фоновых задач.

  1. Вызовите метод RequestAccessAsync, чтобы проверить, может ли приложение отправить запрос фоновой задаче. Это необходимо выполнить до регистрации фоновой задачи.

  2. Зарегистрируйте фоновую задачу до запроса триггера.

  3. Подключите обработчики событий выполнения и завершения к вашему триггеру. Когда ваше приложение активируется после приостановки, Windows предоставит приложению любые события выполнения или завершения в очереди, которые могут использоваться для определения состояния фоновых задач.

  4. Закройте любые открытые объекты устройств или датчиков, когда активируете фоновые задачи DeviceUseTrigger, чтобы эти устройства или датчики могли быть открыты или использованы вашей фоновой задачей.

  5. Зарегистрируйте триггер.

  6. Внимательно изучите воздействие на батарею при доступе к устройству или датчику из фоновой задачи. Например, слишком маленький интервал между отчетами датчика может привести к такому частому выполнению задачи, при котором быстро разряжается батарея.

  7. Когда фоновая задача завершена, отмените ее регистрацию.

  8. Зарегистрируйте отмену событий из класса фоновой задачи. Регистрация для отмены событий разрешит коду фоновой задачи остановить выполнение фоновой задачи без ошибок при отмене системой Windows или вашим приложением на переднем плане.

  9. После завершения работы приложения (не приостановки) отмените регистрацию и отмените любые выполняющиеся задачи, если они больше не требуются приложению. В системах с ограниченными ресурсами, например телефонах с недостаточным объемом памяти, это позволит приложениям использовать фоновую задачу DeviceUseTrigger.

    • Когда приложение завершит работу, отмените регистрацию и отмените любые выполняющиеся задачи.

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

Отмена фоновой задачи

Чтобы отменить задачу, запущенную в фоновом режиме из приложения на переднем плане, используйте метод Unregister объекта BackgroundTaskRegistration, который используется в приложении для регистрации фоновой задачи DeviceUseTrigger. Отмена регистрации фоновой задачи с помощью метода Unregister класса BackgroundTaskRegistration приведет к отмене фоновой задачи инфраструктурой фоновых задач.

Метод Unregister дополнительно принимает логическое значение true или false, указывая, должны ли быть отменены до завершения выполняющиеся в настоящее время экземпляры фоновой задачи. Дополнительные сведения см. в разделе, посвященном методу Unregister, справки по API.

В дополнение к методу Unregister приложению может также потребоваться вызов метода BackgroundTaskDeferral.Complete. Он информирует систему о завершении асинхронной операции, связанной с фоновой задачей.