本文介绍如何配置应用,以便在应用从前台移动到后台时媒体继续播放。 这意味着,即使在用户最小化应用、返回到主屏幕或以其他方式离开应用后,应用也可以继续播放音频。
后台音频播放的场景包括:
长时间运行的播放列表: 用户简要地显示一个前台应用以选择并启动播放列表,之后用户期望播放列表继续在后台播放。
使用任务切换器: 用户短暂地打开前台应用以开始播放音频,然后使用任务切换器切换到另一个打开的应用。 用户希望音频继续在后台播放。
本文中所述的背景音频实现将允许你的应用在所有 Windows 设备(包括移动、桌面和 Xbox)上通用运行。
注释
本文中的代码改编自 UWP 背景音频示例。
单进程模型的说明
在 Windows 10 版本 1607 中,引入了新的单进程模型,极大地简化了启用后台音频的过程。 以前,除了前台应用之外,应用还需要管理后台进程,然后手动传达两个进程之间的状态更改。 在新模型中,只需将后台音频功能添加到应用清单中,应用在移动到后台时会自动继续播放音频。 两个新的应用程序生命周期事件 ,EnteredBackground 和 LeavingBackground 让应用知道它何时进入和离开背景。 当应用进入后台或从后台转换时,系统强制实施的内存约束可能会更改,因此你可以使用这些事件来检查当前内存消耗并释放资源,以便保持低于限制。
通过消除复杂的跨进程通信和状态管理,新模型使你可以更快地实现后台音频,同时大幅减少代码。 但是,当前版本中仍支持双进程模型以实现向后兼容性。 有关详细信息,请参阅 旧版后台音频模型。
后台音频要求
当应用处于后台时,你的应用必须满足音频播放的以下要求。
- 将 后台媒体播放 功能添加到应用清单,如本文后面部分所述。
- 如果应用禁用 MediaPlayer 与系统媒体传输控件(SMTC)的自动集成,例如将 CommandManager.IsEnabled 属性设置为 false,则必须实现与 SMTC 的手动集成才能启用后台媒体播放。 如果使用的是 MediaPlayer 以外的 API(如 AudioGraph),则还必须手动与 SMTC 集成,以便让音频在应用移动到后台时继续播放音频。 在 手动控制系统媒体传输控件的“将系统媒体传输控件用于后台音频”部分中,描述了最低的 SMTC 集成要求。
- 当应用处于后台时,必须保持在系统为后台应用设置的内存使用限制之下。 本文后面提供了有关在后台管理内存的指导。
后台媒体播放清单功能
若要启用后台音频,必须将后台媒体播放功能添加到应用清单文件 Package.appxmanifest。
使用清单设计器将功能添加到应用清单
- 在 Microsoft Visual Studio 中,在 解决方案资源管理器中,双击 package.appxmanifest 项打开应用程序清单的设计器。
- 选择 功能 选项卡。
- 选中 后台媒体播放 复选框。
若要通过手动编辑应用清单 xml 来设置功能,请先确保在 Package 元素中定义 uap3 命名空间前缀。 否则,请添加它,如下所示。
<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.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。 有关详细信息,请参阅 用后台任务支持应用。
相关主题