本文說明如何設定應用程式,讓媒體在應用程式從前景移至背景時繼續播放。 這表示即使使用者已將應用程式最小化、返回主畫面,或以其他方式瀏覽離開您的應用程式,您的應用程式仍可繼續播放音訊。
背景音訊播放的情境包括:
長時間運行的播放清單: 使用者短暫開啟前景應用來選取並開始播放清單,接著預期播放清單會在背景繼續播放。
使用工作切換器: 用戶暫時啟動前景應用程式以開始播放音訊,然後使用工作切換器切換到另一個開啟的應用程式。 用戶預期音訊會繼續在背景播放。
本文中所述的背景音訊實作可讓您的應用程式在所有 Windows 裝置上普遍執行,包括行動裝置、桌面和 Xbox。
備註
本文中的程式代碼是從 UWP 背景音訊範例改編的。
單一流程模型的說明
Windows 10 版本 1607 引進了新的單一進程模型,可大幅簡化啟用背景音訊的程式。 先前,除了前景應用程式之外,您的應用程式還需要管理背景進程,然後手動傳達兩個進程之間的狀態變更。 在新的模型中,您只要將背景音訊功能新增至應用程式指令清單,您的應用程式就會在移至背景時自動繼續播放音訊。 兩個新的應用程式生命週期事件,EnteredBackground 和 LeavingBackground 讓您的 app 知道何時進入和離開背景。 當您的應用程式移動到或從背景移動出來時,系統施加的記憶體限制可能會改變,因此您可以利用這些事件來檢查您目前的記憶體使用情況並釋放資源,以維持低於該限制。
藉由消除複雜的跨進程通訊和狀態管理,新的模型可讓您更快速地實作背景音訊,大幅減少程序代碼。 不過,目前版本中仍支援雙進程模型,以提供回溯相容性。 如需詳細資訊,請參閱 舊版背景音訊模型。
背景音訊要求
當您的應用程式位於背景時,您的應用程式必須符合下列音訊播放需求。
- 將 背景媒體播放 功能新增至您的應用程式指令清單,如本文稍後所述。
- 如果您的 app 停用自動整合 MediaPlayer 與系統媒體傳輸控件 (SMTC),例如將 CommandManager.IsEnabled 屬性設定為 false,則您必須實作與 SMTC 的手動整合,才能啟用背景媒體播放。 如果您使用 MediaPlayer以外的 API,例如 AudioGraph,若要在 app 移至背景時繼續播放音訊,您也必須手動與 SMTC 整合。 在 系統媒體傳輸控制手動控制中的「使用系統媒體傳輸控制進行背景音頻控件」一節中,說明了最低 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.xaml.cs中的 App 類別建構函式。
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。 如需詳細資訊,請參閱 支援您的應用程式的背景工作。
相關主題