Воспроизведение мультимедиа в фоновом режиме
В этой статье показано, как настроить приложение таким образом, чтобы носитель продолжал воспроизводиться при переходе приложения с переднего плана на фон. Это означает, что даже после того, как пользователь свести к минимуму приложение, вернуться на домашний экран или перейти от вашего приложения другим способом, ваше приложение может продолжать воспроизводить звук.
Ниже приведены сценарии фонового воспроизведения звука:
Длинные списки воспроизведения: пользователь кратко открывает приложение переднего плана, чтобы выбрать и запустить список воспроизведения, после чего пользователь ожидает, что список воспроизведения будет продолжать воспроизводиться в фоновом режиме.
Использование переключателя задач: пользователь кратко открывает приложение переднего плана, чтобы начать воспроизведение звука, а затем переключается на другое открытое приложение с помощью переключателя задач. Пользователь ожидает, что звук будет продолжать воспроизводиться в фоновом режиме.
Фоновая реализация звука, описанная в этой статье, позволяет приложению работать универсально на всех устройствах Windows, включая Mobile, Desktop и Xbox.
Примечание.
Код, приведенный в этой статье, был адаптирован из примера фонового звука UWP.
Объяснение однопроцессной модели
В Windows 10 версии 1607 появилась новая модель с одним процессом, которая значительно упрощает процесс включения фонового звука. Ранее приложение было необходимо управлять фоновым процессом в дополнение к приложению переднего плана, а затем вручную передавать изменения состояния между двумя процессами. В новой модели вы просто добавите фоновую функцию звука в манифест приложения, и приложение будет автоматически воспроизводить звук при переходе на фон. Два новых события жизненного цикла приложений, EnteredBackground и LeavingBackground позволяют приложению знать, когда он входит и покидает фон. Когда приложение переходит в переходы к фону или с фона, ограничения памяти, применяемые системой, могут изменяться, поэтому эти события можно использовать для проверки текущего потребления памяти и освобождения ресурсов, чтобы оставаться ниже предела.
Благодаря устранению сложного межпроцессного взаимодействия и управления состоянием новая модель позволяет реализовать фоновый звук гораздо быстрее с значительным сокращением кода. Однако двухпроцессная модель по-прежнему поддерживается в текущем выпуске для обратной совместимости. Дополнительные сведения см. в статье о устаревшей фоновой звуковой модели.
Требования к фоновому звуку
Ваше приложение должно соответствовать следующим требованиям для воспроизведения звука, пока ваше приложение находится в фоновом режиме.
- Добавьте функцию воспроизведения фоновых носителей в манифест приложения, как описано далее в этой статье.
- Если приложение отключает автоматическую интеграцию MediaPlayer с системными элементами управления транспортировкой мультимедиа (SMTC), например путем задания свойства CommandManager.IsEnabled значение false, необходимо реализовать ручную интеграцию с SMTC, чтобы включить воспроизведение фоновых носителей. Вы также должны вручную интегрироваться с SMTC, если вы используете API, отличный от MediaPlayer, например AudioGraph, для воспроизведения звука, если вы хотите, чтобы звук продолжал воспроизводиться при переходе приложения на фон. Минимальные требования к интеграции SMTC описаны в разделе "Использование системных элементов управления транспортировкой мультимедиа для фонового звука" в разделе "Управление транспортировкой системных носителей".
- Хотя приложение находится в фоновом режиме, необходимо оставаться под ограничениями использования памяти, установленными системой для фоновых приложений. Руководство по управлению памятью в фоновом режиме представлено далее в этой статье.
Возможность воспроизведения фонового носителя
Чтобы включить фоновый звук, необходимо добавить возможность воспроизведения фонового носителя в файл манифеста приложения Package.appxmanifest.
Добавление возможностей в манифест приложения с помощью конструктора манифестов
- В Microsoft Visual Studio в Обозреватель решений откройте конструктор манифеста приложения, дважды щелкнув элемент package.appxmanifest.
- Перейдите на вкладку Возможности.
- Установите флажок "Воспроизведение фонового носителя".
Чтобы задать возможность, вручную изменив 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. Дополнительные сведения см. в статье "Поддержка приложения с помощью фоновых задач".
См. также
- Воспроизведение мультимедиа
- Воспроизведение аудио и видео с помощью MediaPlayer
- Интеграция с системными элементами управления транспортировкой мультимедиа
- Пример фонового звука