You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓音频播放Service在手机锁屏休眠时停止运行问题求助

问题排查及解决方案

核心问题原因

你的代码存在几个核心问题直接导致锁屏后播放停止:

  • 你使用的是普通后台Service,Android 8.0及以上系统对后台服务有严格运行限制,锁屏进入休眠后系统会主动回收无前台标记的后台服务,所以播放会中断。
  • SimpleExoPlayer实例在MediaPlayer_Activity中初始化持有,Activity退到后台/锁屏后可能被系统销毁,播放器实例也会被同步回收。
  • 没有配置CPU唤醒锁,手机进入休眠状态时CPU切换到低功耗模式,会暂停音频解码相关任务。

具体修复步骤

1. 将普通Service改造为前台服务

播放音频时必须调用startForeground()绑定通知,让系统识别这是需要长期运行的前台任务,不会被随意回收。需要提前适配:

  • Android 8.0及以上需要先创建通知渠道
  • Android 13及以上需要动态申请POST_NOTIFICATIONS权限
    示例代码加到MusicService的播放逻辑中:
// 播放开始时调用,通知ID不能为0
startForeground(NOTIFICATION_ID, 你的播放控制通知实例);
// 暂停播放时可以调用停止前台,保留服务
stopForeground(false);

2. 把播放器逻辑迁移到Service中

不要在Activity里初始化、持有SimpleExoPlayer,所有播放器的初始化、控制、释放逻辑全部放在MusicService内部实现,Activity只作为UI层通过Binder向Service下发播放、暂停、切歌等指令,更新播放进度UI即可,避免Activity销毁影响播放。

3. 配置唤醒锁

你可以直接使用ExoPlayer自带的唤醒锁管理,无需自己手动维护WakeLock,初始化播放器时添加如下配置:

simpleExoPlayer = new SimpleExoPlayer.Builder(MusicService.this).build();
// 配置唤醒锁,播放时自动持有CPU和WiFi锁,停止后自动释放
simpleExoPlayer.setWakeMode(C.WAKE_MODE_NETWORK);

同时记得在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /> <!-- Android 12及以上需要 -->

4. 适配国内ROM后台限制

小米、华为、OPPO、vivo等国产定制ROM有额外的电池优化策略,即便是前台服务也可能被后台查杀,可以引导用户手动将APP加入电池优化白名单、开启后台活动权限。

额外调整建议

如果需要用户从最近任务列表划走APP后仍继续播放,可以修改onTaskRemoved方法中的逻辑,不要在该方法中释放SimpleExoPlayer和取消通知。

内容的提问来源于stack exchange,提问作者20IT130 - Vanshaj Raj Bhati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:36:01