MAUI 本身不原生支持后台音频播放,必须结合各平台的底层机制来实现。核心在于两件事:一是让系统允许你的 App 在后台继续运行音频任务;二是用平台原生能力(如 Android 的
MediaPlayer、iOS 的
AVAudioSession)接管播放逻辑,并正确配置生命周期行为。
Android 平台:启用后台服务 + 正确声明权限
单纯用
MediaPlayer在前台 Activity 中播放,App 进入后台后会被系统暂停或回收。要持续播放,推荐使用 前台 Service(Foreground Service),并配合通知栏常驻提醒: 在
AndroidManifest.xml中添加权限和前台服务声明:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"></uses-permission>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"></uses-permission>(Android 13+ 必需) 创建一个继承
Service的类(如
MusicForegroundService),在
onStartCommand中调用
startForeground(id, notification)把播放控制逻辑(播放/暂停/进度更新)封装进该 Service,通过
Intent或绑定方式与 UI 通信 不要在 Activity 中直接 new MediaPlayer 并长期持有——它无法跨进程存活,且易被系统杀死
iOS 平台:配置后台模式 + 设置 AVAudioSession
iOS 对后台音频限制严格,仅靠 Info.plist 配置不够,还需代码层激活音频会话:
在Info.plist中添加:
<key>UIBackgroundModes</key>
<array><string>audio</string></array>在 App 启动时(如
AppDelegate或 MAUI 的
MauiProgram.cs初始化阶段)配置
AVAudioSession:
var session = AVAudioSession.SharedInstance();
session.SetCategory(AVAudioSessionCategory.Playback, AVAudioSessionCategoryOptions.MixWithOthers);
session.SetActive(true);务必调用
SetActive(true),否则后台播放不会生效;若需锁屏控制,还需启用远程命令(
UIApplication.SharedApplication.BeginReceivingRemoteControlEvents())
MAUI 跨平台整合要点
不能把平台逻辑写死在共享项目里,要用依赖注入 + 接口抽象:
定义统一接口,如IAudioPlayer(含
Play()、
Pause()、
Stop()、
IsPlaying等) Android 实现类中启动 Foreground Service 并委托播放;iOS 实现类中管理
AVPlayer实例和会话状态 在
MauiProgram.cs中注册为 Singleton:
builder.Services.AddSingleton<iaudioplayer audioplayerimplementation>();</iaudioplayer>ViewModel 中只依赖
IAudioPlayer,完全解耦平台细节
常见失效原因与检查清单
后台播放失败,90% 出在这几处:
Android:没加FOREGROUND_SERVICE权限,或没调用
startForeground()→ 系统强制停止 Service iOS:Info.plist 缺少
UIBackgroundModes,或代码中漏掉
SetActive(true)→ 进后台瞬间音频中断 MAUI:服务未在
MauiProgram.cs注册,或 ViewModel 拿到的是 null 实例 → 播放调用静默失败 通用:音频文件路径错误(尤其是 iOS Bundle 资源路径需用
NSBundle.MainBundle.PathForResource获取)
基本上就这些。后台播放不是“打开开关”就能行的事,而是平台能力、系统策略、MAUI 架构三者对齐的结果。每一步都得踩准,缺一不可。
