【问题标题】:onPause onResume alternative?onPause onResume 替代方案?
【发布时间】:2014-03-15 19:20:58
【问题描述】:

我有点进退两难,不太确定如何解决。这是场景...

我有一个多活动应用程序,它从启动到应用程序退出时播放音乐。

但是,如果我使用 onPause / onResume 来检测活动何时发送到后台并在 onPause 中暂停音乐并在 onResume 中恢复播放,当我开始下一个活动时,音乐会短暂“跳过”,因为调用活动是调用 startActivity() 后完成。

如果我没有在 onPause / onResume 中暂停/恢复音乐,音乐会流畅播放,但如果按下 home 键并将活动发送到后面,则不会停止。

有没有一种方法可以检测活动是否发送到后台(例如使用计时器和应用程序标志)而无需使用 onPause / onResume?

如果这不可能或太难实现(我仍在学习),有没有办法创建一个“隐形”启动器活动,它在后台运行以处理此类事情但从未见过?

一如既往,提前致谢。

【问题讨论】:

    标签: android android-mediaplayer onresume onpause


    【解决方案1】:

    事实证明没有简单的方法解决这个问题。

    您应该做的第一件事是将您的音乐流传输到服务中,这样它就不会依赖于任何活动。

    然后你需要告诉服务在整个应用程序处于后台时停止,而不是在一个活动暂停时。这个很好的答案建议在您的应用程序中添加一个计时器,并在活动暂停后等待几秒钟。应用程序中没有其他活动被恢复 - 应用程序被假定在后台。

    我不会在您的应用程序中添加计时器,而是让您的音乐播放服务执行此操作(通知每个onPauseonResume 中的服务)。另外,两秒播放音乐太长了,我从500ms开始,看看是否可以接受。

    【讨论】:

    • 我们不能像我的回答中建议的那样用一个标志来解决这个问题吗?
    【解决方案2】:

    恕我直言,这很简单

    您想弄清楚的是,如果新活动来自您的应用程序,则继续播放音乐,否则停止。

    你可以用一个布尔标志来做到这一点。

    算法如下:

    -在所有活动中,onResume 中的布尔标志设置为 true
    - 将暂停音乐的语句保留在 onPause
    - 将上述语句(在 onPause 中)放入 if(布尔标志)
    - 每当一个事件碰巧启动一个新活动时,即在您的活动中单击一个按钮等,清除事件侦听器中的标志(将其设置为 false) - 例如:按钮的 onClickListener

    这应该可行

    【讨论】:

      【解决方案3】:

      activity之间的切换是这样的:

      Activity A onPause
      Activity B onCreate (or onRestart if it's already created)
      Activity B onStart
      Activity B onResume
      Activity A onStop
      

      您有几种选择来利用这一点。您可以继承应用程序,并在应用程序类中保留一个布尔值。创建一个执行以下操作的基本 Activity:

      1. 在 onPause() 中,调用应用程序将布尔值更改为 false。
      2. 在 onResume() 中,调用应用程序将布尔值更改为 true。
      3. 在 onStop() 中,调用应用程序以停止音乐,除非布尔值设置为 true。

      如果您的所有活动都扩展了这个基础活动,那么这将起作用。当 A 停止时,只要 B 是您的另一个活动,它就会恢复并将布尔值设置为 true,因此您的音乐将继续播放。

      还有第二种方法使用绑定服务,您可以在 onStart() 中绑定并在 onStop() 中取消绑定。如果您愿意,可以自行探索。

      【讨论】:

        【解决方案4】:

        您可以(事实上应该)使用服务来处理音乐播放器。这是您称为“隐形活动”的组件。 如果您通过 onResume 中的 bindService() 方法启动它,并在应用程序中每个活动的 onPause() 中取消绑定,它应该一直运行。当没有活动绑定到正在运行的服务时,服务会被系统停止,因此您只需在服务的 onDestroy() 或 onUnbind() 方法中停止音乐即可。

        这里有一个很好的服务生命周期图:http://www.tutorialspoint.com/android/android_services.htm

        如果服务器生命周期的自动管理就足够了,我不是 100% - 在这种情况下,您可以使用 startService() 方法来保持服​​务始终工作,当调用 onUnbind 服务时延迟一些时间(即使用Handler.postDelayed(Runnable r) ) 检查是否在 1s 之后服务仍然未绑定并在这种情况下 stopSelf()。

        【讨论】:

          【解决方案5】:

          好的,这就是解决方案,一旦我以更合乎逻辑的方式考虑它,它就相当简单了。

          我所做的是:-

          1. 创建一个名为 activityCount 的公共静态 int。
          2. 在每个活动的 onCreate 函数中,我将 activityCount 加 1。
          3. 我 @Override public void finish() 并将 activityCount 减一 并调用 super.finish()。
          4. 在 onPause 中,如果 activityCount == 1,则暂停音乐。
          5. 在 onResume 中,如果 activityCount == 1,播放音乐。

          这通过连续播放音乐给了我想要的效果,但是当点击主页按钮时,音乐停止并在活动恢复时恢复。

          感谢所有建议,因为它帮助我更理性地思考。

          【讨论】:

            猜你喜欢
            • 2012-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-13
            • 1970-01-01
            • 1970-01-01
            • 2012-07-21
            相关资源
            最近更新 更多