2015-12-24 107 views
1

我正在研究一个应用程序,它使用MediaPlayer对象从WallpaperService播放H.264 MP4视频,因为它是一个动态壁纸应用程序。如果使用mediaPlayer.pause()或mediaPlayer.stop()暂停/停止MediaPlayer,则设备(Nexus 5,Android 6.0.1)处于空闲和睡眠状态时会发生电池消耗。过夜多次测试时,排水量约为3-7%/小时。只要我用mediaPlayer.release()发布媒体播放器,电池消耗就会以更正常的1%/小时的速度回落。当onVisibilityChanged调用false时,我暂停/停止mediaPlayer。据报道,该手机将在股票的Android电池图表和更好的电池统计数据中入睡。不释放MediaPlayer导致电池消耗

如果CPU正在成功进入睡眠状态,如何解决电池耗尽问题?

编辑:我发现的新东西是,当在mediaPlayer.pause()之前调用mediaPlayer.setSurface(null)时,闲置电池的使用恢复正常。然后,我可以在mediaPlayer.start()之前将mediaPlayer.setSurface(surface)设置回来。问题是重启后几秒钟内会出现一些黑色伪像。

回答

0

我不能给你一个确切的答案,但可以给你什么寻找。我怀疑发生了什么事是pause()正在频繁地检查事件,以防止处理器进入深度睡眠/ C状态。相反,stop()不需要检查事件,因此允许处理器进入深度睡眠状态。几年前我写了an article on sleep states

我怀疑该函数的作者决定更频繁地检查,而不是必要的。这是一个非常常见的错误,因为开发人员认为更短的睡眠时间/更频繁的检查会导致更好的响应(几乎从不这样做)。您可以通过使用实际检查硬件睡眠状态的处理器电源监视器来检查此情况。不幸的是,大多数不会并且只检查处理器独立的“等价物”。

所以让我们回到你的问题:你能做些什么呢。我可以给你一些建议,但它没有一个非常令人满意的:

  1. 检查的API或数据结构,它允许您设置为暂停的 检测时间间隔()。顺便说一下,我不知道任何。
  2. 写你自己的。当然,这种复杂化写作平台无关的应用程序
  3. 使用替代的媒体播放器,做了对谷歌这一正确
  4. 锤,直到它的固定

就像我说的,这一切都不是非常令人满意的。顺便说一下,搜索网络,我发现证据表明,这已经发生了不止一次的Android新版本。

祝你好运,让我们知道发生了什么。

+0

感谢您的建议。看着暂停()它导致我不能检查的本地方法。我发现的新东西是,如果在mediaPlayer.pause()之前执行mediaPlayer.setSurface(null),闲置电池的使用将恢复正常。然后,我可以在mediaPlayer.start()之前将mediaPlayer.setSurface(surface)设置回来。问题是在重启后几秒钟内会出现一些黑色伪像。 – Flyview

+0

新编辑:mediaPlayer.stop()也会发生同样的情况。如果你不做mediaPlayer.release(),电池耗尽仍在继续。 – Flyview