在 Windows 8 應用開發中,背景任務是實現多任務處理的關鍵機制。本文深入探討如何利用 MediaControl 類別實現音樂的背景播放與控制,讓使用者即使切換到其他應用或鎖定螢幕時,仍能透過系統媒體控制介面(如音量鍵、耳機按鈕)操作播放、暫停、上一首、下一首等功能。
首先定義一個用於封裝音樂檔案元資料的模型類別:
using System;
using System.Threading.Tasks;
using Windows.Storage;
namespace XamlDemo.BackgroundTask
{
public class SongModel
{
public StorageFile File { get; private set; }
public string Artist { get; private set; }
public string Title { get; private set; }
public SongModel(StorageFile file)
{
File = file;
}
public async Task LoadMusicPropertiesAsync()
{
var properties = await File.Properties.GetMusicPropertiesAsync();
Artist = properties.Artist;
Title = properties.Title;
}
}
}
XAML 介面包含檔案選取、播放控制按鈕,以及關鍵的 MediaElement 設定:
<MediaElement Name="mediaElement"
AudioCategory="BackgroundCapableMedia"
AutoPlay="False"
MediaOpened="mediaElement_MediaOpened"
MediaEnded="mediaElement_MediaEnded"
CurrentStateChanged="mediaElement_CurrentStateChanged" />
關鍵點: 必須將 AudioCategory 設為 BackgroundCapableMedia,才能支援背景播放。
在頁面建構子中註冊所有媒體控制事件:
public MediaControlDemo()
{
this.InitializeComponent();
MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
MediaControl.PlayPressed += MediaControl_PlayPressed;
MediaControl.PausePressed += MediaControl_PausePressed;
MediaControl.StopPressed += MediaControl_StopPressed;
MediaControl.PreviousTrackPressed += MediaControl_PreviousTrackPressed;
MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
MediaControl.RewindPressed += MediaControl_RewindPressed;
MediaControl.FastForwardPressed += MediaControl_FastForwardPressed;
MediaControl.SoundLevelChanged += MediaControl_SoundLevelChanged;
_previousTrackPressedRegistered = true;
_nextTrackPressedRegistered = true;
}
async void MediaControl_PlayPauseTogglePressed(object sender, object e)
{
if (MediaControl.IsPlaying)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => mediaElement.Pause());
await OutputMessage("Play/Pause Pressed - Pause");
}
else
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => mediaElement.Play());
await OutputMessage("Play/Pause Pressed - Play");
}
}
示範如何根據播放清單位置動態啟用或停用上一首、下一首按鈕:
async void MediaControl_PreviousTrackPressed(object sender, object e)
{
await OutputMessage("Previous Track Pressed");
if (_currentSongIndex > 0)
{
if (_currentSongIndex == (_playList.Count - 1))
{
if (!_nextTrackPressedRegistered)
{
MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
_nextTrackPressedRegistered = true;
}
}
_currentSongIndex--;
if (_currentSongIndex == 0)
{
MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;
_previousTrackPressedRegistered = false;
}
await SetCurrentPlayingAsync(_currentSongIndex);
}
}
在 Package.appxmanifest 中必須宣告背景任務並勾選「音訊」類型:
專案包含以下核心檔案:
BackgroundTask/SongModel.cs - 音樂資料模型BackgroundTask/MediaControlDemo.xaml - 使用者介面BackgroundTask/MediaControlDemo.xaml.cs - 邏輯實作BackgroundCapableMedia 是背景播放的前提Dispatcher.RunAsync 回到 UI 執行緒MediaControl.IsPlaying、TrackName、ArtistName 等屬性與實際播放狀態同步原始碼下載:Windows8.rar