【问题标题】:Using WakeLock to Keep A Stream Playing使用 WakeLock 保持流播放
【发布时间】:2011-06-21 23:26:16
【问题描述】:

我有一个在服务中运行的 MediaPlayer,它正在播放来自 URL(流)的音频。到目前为止,它似乎运行良好,甚至在我将手机置于待机状态时还能继续播放。

我目前没有获得唤醒锁。我的问题是:

  • 在我的情况下是否真的需要获取唤醒锁?
  • 如果有必要,我应该获取哪种类型的唤醒锁?

是的,这是唤醒锁的合法用例,因为我的用户明确希望音频继续播放。

【问题讨论】:

    标签: android media-player wakelock


    【解决方案1】:
    1. 在手机处于待机状态时观看约五分钟。如果它继续播放,则不需要唤醒锁;它可能表明 MediaPlayer 实例已经有一个。在 Android 中,在用户不活动大约两分钟后,任何没有唤醒锁的不必要的东西都将被挂起;五分钟应该可以消除对两分钟计时器的任何疑问。
    2. 试试partial wake lock. 它将让您的用户听到音频,因为处理器将保持“唤醒”。但是,由于允许屏幕进入睡眠状态,因此在显示图像时不会浪费电池。这可能就是您想要的。

    编辑:如果您想安全地玩游戏,那么您想使用 WakeLock。这样,如果 MediaPlayer 发生变化并在手机挂起时允许进入睡眠状态,您的程序仍然可以正常工作。添加 WakeLock 确实没有什么可失去的,只要您在不再需要它时正确地释放它。如果你不这样做,你只会消耗比你想要的更多的电池,在最坏的情况下,你会立即看到一个错误,表明你在应用程序终止时没有释放锁。添加 WakeLock - 虽然可能是多余的 - 是一种很好的做法,因为它可以让您的应用程序更健壮地抵抗它所依赖的软件的更改。

    【讨论】:

    • 但也许不同的手机会有不同的表现?另外,模拟器也模拟这个吗?
    • 嗯。好点子。不同的手机可能会有不同的行为,但据我所知,这种“两分钟”行为是 Android 的标准配置。如果有人可以给你一个例外,那就把他们的话放在我的上面。尽管如此,安全总比后悔好,对吧?获取唤醒锁并不难。为什么不抓住一个以确保您的应用程序始终按预期工作?
    • 所以在不需要的地方获取唤醒锁不会产生蚂蚁“副作用”?
    • 我曾使用过一个应用程序,其中一次获取多个唤醒锁并且没有负面影响(有独立线程需要唤醒锁而彼此不了解)。除了明显的电池消耗(如果 MediaPlayer 实例已经具有 WakeLock,无论如何都会发生这种情况),如果您不必要地获得一个,您不应该看到对您的程序有任何负面影响。
    • 获取多个唤醒锁肯定没问题。唤醒锁的含义是“在持有它的同时 CPU 保持唤醒状态”。如果您持有两个唤醒锁,那么您只有两件事希望 CPU 保持清醒并且正如您所期望的那样保持清醒。
    【解决方案2】:

    默认情况下,MediaPlayer 不会自动为您执行此操作。

    但是,您不必获取唤醒锁,它有一个方法,您可以调用它来告诉它在玩游戏时为您保留一个:

    http://developer.android.com/reference/android/media/MediaPlayer.html#setWakeMode(android.content.Context, int)

    请注意,正如文档所述,它仍然是您的应用持有唤醒锁,因此要使用此功能,您需要请求唤醒锁权限。

    【讨论】:

    • 那么媒体播放器有可能突然停止播放吗?或者这只是一个额外的预防措施?如果 MediaPlayer 获取锁,或者我获取锁,有什么区别?
    【解决方案3】:

    您可能需要 WakeLock,因为您不能保证 PowerManager 在播放期间不会启动和休眠。 PARTIAL_WAKE_LOCK 将确保使用最低级别的电池消耗(CPU 开启;屏幕/键盘关闭)。您总是可以测试电池消耗的影响,但我怀疑它会很大,因为无论如何必须打开 CPU 才能播放音乐。此方法将确保无论使用什么手机(或该手机上的设置),播放都不会因 CPU 进入睡眠状态而中断。

    【讨论】:

      【解决方案4】:

      我认为您不需要 WakeLock。刚开始使用 MediaPlayer 时,我很快发现它不会在待机状态下关闭。为了克服这个问题,我做了一些工作,但我从未见过待机导致流媒体播放器对象死亡的情况。

      【讨论】:

        【解决方案5】:
          mediaPlayer.setScreenOnWhilePlaying(true);
        

        文档说: “在可能的情况下,这是优于 'setWakeMode' 的首选方法,因为它不需要应用程序具有低级唤醒锁访问权限。”

        【讨论】:

          【解决方案6】:

          您不需要 WAKE LOCK。如果您使用 WAKE LOCK,您将强制用户保持屏幕开启,我个人更喜欢在播放媒体时关闭屏幕。

          这里是长时间运行服务的示例example

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多