我已经阅读了几篇关于Android M中新的'Doze'模式的文章,也看了Android开发者网站上的文章:https://developer.android.com/training/monitoring-device-state/doze-standby.html,但我仍然在手机上(Android 6.0.1)遇到一个前台服务无法正确运行的问题。
问题:
我有一个服务,使用MediaPlayer对象处理播放音乐,该服务实现了onCompletion和onPrepared MediaPlayer接口。
伪代码:
该应用程序在手机连接电源、屏幕开启或应用开启且屏幕开启时运行良好。然而,当手机处于空闲状态下播放音乐(介于5至40分钟之间),一旦onCompletion()被调用,该服务就无法检索到下一首曲目。
服务已设置并满足以下条件: - 服务通知已使用startForeground()方法启动。 - MediaPlayer对象具有部分wakelock PARTIAL_WAKE_LOCK。 - 服务在单独的进程中运行,与主应用程序/用户界面分离。 - 所有媒体使用prepareAsync(),获取下一曲uri的逻辑在后台线程中执行,仅在主线程中调用prepareAsync()方法。
我尝试过以下方法: - 在主线程中检索下一首歌曲(onCompletion()被调用后)而不是在后台线程中。 - 在onCompletion()中获取单独的Partial WakeLock,并在onPrepared()方法被调用时进行保持和释放。 - 还尝试了其他一些无关紧要的事情,但没有任何变化…
我有一个logcat输出,在手机长时间未使用、屏幕关闭且未连接电源时获取了logcat(一旦我重新插上电源并更新日志,便演示了这个问题)。
例程将是以下步骤:
我不认为这是设备的问题,因为我使用的其他音乐应用程序在这种情况下工作正常,但是我只能在一个真实设备上进行测试 :(
如果您已经阅读到这里,感谢您的耐心!任何建议将不胜感激(希望是关于解决方案而不是我的音乐品味!)。
问题:
我有一个服务,使用MediaPlayer对象处理播放音乐,该服务实现了onCompletion和onPrepared MediaPlayer接口。
伪代码:
public class MusicService extends Service implements MediaPlayer.OnPreparedListener,
MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
// Class Variables/Methods etc...
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
// update notification using startForeground()
}
@Override
public void onCompletion(MediaPlayer mp) {
// Go and get another music track in separate thread
// (Have used AsyncTask and RX Java/RX Android to test if problem is here - works fine)
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// handleError
return false;
}
}
该应用程序在手机连接电源、屏幕开启或应用开启且屏幕开启时运行良好。然而,当手机处于空闲状态下播放音乐(介于5至40分钟之间),一旦onCompletion()被调用,该服务就无法检索到下一首曲目。
服务已设置并满足以下条件: - 服务通知已使用startForeground()方法启动。 - MediaPlayer对象具有部分wakelock PARTIAL_WAKE_LOCK。 - 服务在单独的进程中运行,与主应用程序/用户界面分离。 - 所有媒体使用prepareAsync(),获取下一曲uri的逻辑在后台线程中执行,仅在主线程中调用prepareAsync()方法。
我尝试过以下方法: - 在主线程中检索下一首歌曲(onCompletion()被调用后)而不是在后台线程中。 - 在onCompletion()中获取单独的Partial WakeLock,并在onPrepared()方法被调用时进行保持和释放。 - 还尝试了其他一些无关紧要的事情,但没有任何变化…
我有一个logcat输出,在手机长时间未使用、屏幕关闭且未连接电源时获取了logcat(一旦我重新插上电源并更新日志,便演示了这个问题)。
06-15 02:31:39.346 musicplayer:music_service E/MusicService: onPrepared : Tom Petty GH - 11 - You Got Lucky
06-15 02:31:39.548 musicplayer:music_service D/MusicService: Releasing wakelock
06-15 02:35:15.467 musicplayer:music_service E/MusicService: onCompletion called
06-15 02:35:15.467 musicplayer:music_service D/MusicService: Acquiring wakelock
06-15 02:35:15.514 musicplayer:music_service D/NextActionStrategy: Retrieving song - rx java - Main Ui Thread =false
06-15 02:35:15.870 musicplayer:music_service D/NextActionStrategy: Song Retrieved : Ten Years- Main Ui Thread = true
06-15 02:35:15.950 musicplayer:music_service E/MusicService: onPrepared : Ten Years
06-15 02:35:16.149 musicplayer:music_service D/MusicService: Releasing wakelock
06-15 02:38:59.002 musicplayer:music_service E/MusicService: onCompletion called
06-15 02:38:59.002 musicplayer:music_service D/MusicService: Acquiring wakelock
06-15 02:38:59.049 musicplayer:music_service D/NextActionStrategy: Retrieving song - rx java - Main Ui Thread =false
06-15 02:38:59.211 musicplayer:music_service D/NextActionStrategy: Song Retrieved : What Am I- Main Ui Thread = true
06-15 02:50:07.642 musicplayer:music_service E/MusicService: onPrepared : What Am I
06-15 02:50:07.976 musicplayer:music_service D/MusicService: Releasing wakelock
06-15 02:50:22.097 musicplayer:music_service D/MusicService: onStartCommand called : action.PAUSE
例程将是以下步骤:
- 播放音轨
- 调用onCompletion()
- 获取唤醒锁并获取下一首曲目
- PrepareAsync()
- 调用onPrepared - 开始播放并使用startForeground更新通知
我不认为这是设备的问题,因为我使用的其他音乐应用程序在这种情况下工作正常,但是我只能在一个真实设备上进行测试 :(
如果您已经阅读到这里,感谢您的耐心!任何建议将不胜感激(希望是关于解决方案而不是我的音乐品味!)。
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
方法来代替。此外,使用setAlarmClock
也可以,但是在设备顶部会有一个时钟图标,并且闹钟通过系统时间显示出来。 - Opiatefuchs