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 上没有问题。我有适用于这些版本的物理设备,它们都可以完美运行。)
设备信息:
- OS 版本:3.0.31-656355
- 发布:4.1.1
- 设备:comancheatt
- 型号:SAMSUNG-SGH-I547
- 产品:comancheuc
- 品牌:三星
- 显示:JRO03L.I547UCBLL1
- CPU_ABI: armeabi-v7a
- CPU_ABI2: armeabi
- 硬件:qcom
- 编号:JRO03L
- 制造商:三星
- 用户:se.infra
- HOST:SEP-125
我明白了;我希望这对你也有帮助......
问题是 不是 触发 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();
我的问题 是瞎猜:Android 4.x / Jelly Bean 是怎么回事?服务、粘性、前台等是否存在已知问题?
背景故事:我在各种 Android 设备和模拟器上成功测试了我的音乐播放器应用程序,然后最近才在物理 Jelly Bean 设备(Samsung Rugby Pro ).我发现 MediaPlayer
onCompletion
函数在屏幕关闭时 而不是 一直被触发。大多数情况下,它会在 几分钟 后才被触发。当屏幕打开时,无论我的 activity 是否显示,应用程序都可以正常工作。
(在 Gingerbread、KitKat、Lollipop 或 Marshmallow 上没有问题。我有适用于这些版本的物理设备,它们都可以完美运行。)
设备信息:
- OS 版本:3.0.31-656355
- 发布:4.1.1
- 设备:comancheatt
- 型号:SAMSUNG-SGH-I547
- 产品:comancheuc
- 品牌:三星
- 显示:JRO03L.I547UCBLL1
- CPU_ABI: armeabi-v7a
- CPU_ABI2: armeabi
- 硬件:qcom
- 编号:JRO03L
- 制造商:三星
- 用户:se.infra
- HOST:SEP-125
我明白了;我希望这对你也有帮助......
问题是 不是 触发 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();