Поделиться через


Воспроизведение мультимедиа в фоновом режиме

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

Ниже приведены сценарии фонового воспроизведения звука:

  • Длинные списки воспроизведения: пользователь кратко открывает приложение переднего плана, чтобы выбрать и запустить список воспроизведения, после чего пользователь ожидает, что список воспроизведения будет продолжать воспроизводиться в фоновом режиме.

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

Фоновая реализация звука, описанная в этой статье, позволяет приложению работать универсально на всех устройствах Windows, включая Mobile, Desktop и Xbox.

Примечание.

Код, приведенный в этой статье, был адаптирован из примера фонового звука UWP.

Объяснение однопроцессной модели

В Windows 10 версии 1607 появилась новая модель с одним процессом, которая значительно упрощает процесс включения фонового звука. Ранее приложение было необходимо управлять фоновым процессом в дополнение к приложению переднего плана, а затем вручную передавать изменения состояния между двумя процессами. В новой модели вы просто добавите фоновую функцию звука в манифест приложения, и приложение будет автоматически воспроизводить звук при переходе на фон. Два новых события жизненного цикла приложений, EnteredBackground и LeavingBackground позволяют приложению знать, когда он входит и покидает фон. Когда приложение переходит в переходы к фону или с фона, ограничения памяти, применяемые системой, могут изменяться, поэтому эти события можно использовать для проверки текущего потребления памяти и освобождения ресурсов, чтобы оставаться ниже предела.

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

Требования к фоновому звуку

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

  • Добавьте функцию воспроизведения фоновых носителей в манифест приложения, как описано далее в этой статье.
  • Если приложение отключает автоматическую интеграцию MediaPlayer с системными элементами управления транспортировкой мультимедиа (SMTC), например путем задания свойства CommandManager.IsEnabled значение false, необходимо реализовать ручную интеграцию с SMTC, чтобы включить воспроизведение фоновых носителей. Вы также должны вручную интегрироваться с SMTC, если вы используете API, отличный от MediaPlayer, например AudioGraph, для воспроизведения звука, если вы хотите, чтобы звук продолжал воспроизводиться при переходе приложения на фон. Минимальные требования к интеграции SMTC описаны в разделе "Использование системных элементов управления транспортировкой мультимедиа для фонового звука" в разделе "Управление транспортировкой системных носителей".
  • Хотя приложение находится в фоновом режиме, необходимо оставаться под ограничениями использования памяти, установленными системой для фоновых приложений. Руководство по управлению памятью в фоновом режиме представлено далее в этой статье.

Возможность воспроизведения фонового носителя

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

Добавление возможностей в манифест приложения с помощью конструктора манифестов

  1. В Microsoft Visual Studio в Обозреватель решений откройте конструктор манифеста приложения, дважды щелкнув элемент package.appxmanifest.
  2. Перейдите на вкладку Возможности.
  3. Установите флажок "Воспроизведение фонового носителя".

Чтобы задать возможность, вручную изменив XML манифеста приложения, сначала убедитесь, что префикс пространства имен uap3 определен в элементе Package . Если нет, добавьте его, как показано ниже.

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">

Затем добавьте функцию backgroundMediaPlayback в элемент Capabilities :

<Capabilities>
    <uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>

Обработка перехода между передним планом и фоном

Когда приложение перемещается с переднего плана на фон, вызывается событие EnteredBackground. И когда приложение возвращается на передний план, вызывается событие LeavingBackground. Так как это события жизненного цикла приложения, необходимо зарегистрировать обработчики для этих событий при создании приложения. В шаблоне проекта по умолчанию это означает добавление его в конструктор классов App в App.xaml.cs.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    this.EnteredBackground += App_EnteredBackground;
    this.LeavingBackground += App_LeavingBackground;
}

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

bool _isInBackgroundMode = false;

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

private void App_EnteredBackground(object sender, EnteredBackgroundEventArgs e)
{
    _isInBackgroundMode = true;
}

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

private void App_LeavingBackground(object sender, LeavingBackgroundEventArgs e)
{
    _isInBackgroundMode = false;
}

Требования к управлению памятью

Наиболее важной частью обработки перехода между передним планом и фоном является управление памятью, используемой приложением. Так как выполнение в фоновом режиме уменьшит ресурсы памяти, которые приложение может хранить в системе, необходимо также зарегистрировать события AppMemoryUsageIncreased и AppMemoryUsageLimitChanging. При возникновении этих событий необходимо проверить текущее использование памяти вашего приложения и текущее ограничение, а затем сократить использование памяти при необходимости. Сведения о сокращении использования памяти во время работы в фоновом режиме см. в статье "Бесплатная память" при переходе приложения на фон.

Доступность сети для фоновых приложений мультимедиа

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

Если необходимо выполнять сетевые вызовы, которые происходят в фоновом режиме, если носитель не скачивается, они должны быть упакованы в соответствующую задачу, например MaintenanceTrigger или TimeTrigger. Дополнительные сведения см. в статье "Поддержка приложения с помощью фоновых задач".