4.1.x (Jelly Bean) 上的 Android 服务是否存在已知问题?

Are there known issues with Android Services on 4.1.x (Jelly Bean)?

我的问题 是瞎猜:Android 4.x / Jelly Bean 是怎么回事?服务、粘性、前台等是否存在已知问题?

背景故事:我在各种 Android 设备和模拟器上成功测试了我的音乐播放器应用程序,然后最近才在物理 Jelly Bean 设备(Samsung Rugby Pro ).我发现 MediaPlayer onCompletion 函数在屏幕关闭时 而不是 一直被触发。大多数情况下,它会在 几分钟 后才被触发。当屏幕打开时,无论我的 activity 是否显示,应用程序都可以正常工作。

(在 Gingerbread、KitKat、Lollipop 或 Marshmallow 上没有问题。我有适用于这些版本的物理设备,它们都可以完美运行。)

设备信息:

我明白了;我希望这对你也有帮助......

问题是 不是 触发 onCompletion 事件,而是 reset() 无限期阻塞。我之前将此归因于 Android issue #959: MediaPlayer "crash" (deadlocks the calling thread) when resetting or releasing an unused MediaPlayer,这对我的情况来说是不正确的。

我的特殊问题是我的测试设备上的攻击性睡眠行为。当我 运行 在飞行模式下与其他几个应用程序一起使用时,会弹出此错误,因为对 reset()(或 release())的调用也会释放 MediaPlayer 实例的 WakeLock .一旦发生这种情况,设备就会休眠,代码似乎会阻塞该功能。我无法在插入调试器 and/or 的情况下重现此问题,因为其中任何一个都阻止了设备休眠!

我的解决方案 是创建一个单独管理的 WakeLock ,我 acquire() 基本上是在播放开始时和 release() 所有歌曲播放完之后通过。从技术上讲,我只在 activity 已暂停并在恢复时释放时才这样做,因为当设备已经唤醒时没有必要保持 WakeLock

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyTag");
wakeLock.acquire();