不建议将音频/媒体播放器逻辑与导航逻辑或页面对象紧密耦合 - 特别是如果您希望它在后台继续播放。最简单的方法是拥有一个AudioPlayerService类,该类订阅
MessengingCenter以获取音频播放器命令,例如播放、暂停等。当发布播放命令时,它可以启动一个后台线程来播放音频文件。
MessagingCenter.Subscribe<Page2, AudioPlayerArgs> (this, "Play", (sender, args) => {
// initiate thread to play song
});
现在,当您从页面1导航到页面2时,可以通过
MessengingCenter向AudioPlayerService类发布/发送命令以开始播放歌曲。这样,无论在页面1或页面2之间来回多少次,音频播放器都不会受到影响,因为如果它已经播放相同的音频文件,它可以忽略播放命令。
MessagingCenter.Send<Page2, AudioPlayerArgs> (this, "Play", new AudioPlayerArgs("<sound file path>"))
注意: 我个人避免在我的代码中使用MessengingCenter - 更好的方法是引入一个接口用于IAudioPlayerService,并使用适当的方法来播放、暂停等,然后使用DependencyService来维护AudioPlayerService状态作为全局对象(这是默认行为)
public interface IAudioPlayerService {
bool PlayAudio(string file);
bool PauseAudio();
bool StopAudio();
}
[assembly: Xamarin.Forms.Dependency (typeof (IAudioPlayerService))]
public class AudioPlayerService : IAudioPlayerService {
}
使用以下代码在您的页面/视图模型对象中控制音频播放器服务。
DependencyService.Get<IAudioPlayerService>().Play("<sound file path>")
PushModalAsync()
,而不是每次都创建它。 - Alex