安卓音频播放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
相关产品推荐
相关产品推荐

