onPause onResume替代?

时间:2014-03-15 19:20:59

标签: android android-mediaplayer onresume onpause

我有点困境,不太确定如何解决它。这是场景......

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

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

如果我暂停/恢复onPause / onResume中的音乐,音乐会顺利播放,但如果按下主页键并且活动被发送到后面,音乐不会停止。

有没有办法检测活动被发送到后台(使用,比如计时器和应用程序标志)而不必使用onPause / onResume?

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

一如既往,提前谢谢。

5 个答案:

答案 0 :(得分:2)

事实证明,这并没有简单的方法。

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

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

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

答案 1 :(得分:0)

非常简单的恕我直言

您想要确定的是,如果新活动来自您的应用,请继续播放音乐,否则请停止播放。

您可以使用布尔标志执行此操作。

这是算法:

在所有活动的onResume中,

-boolean flag设置为true - 保持暂停音乐的声明onPause
- 将上述语句(在onPause中)放在if(布尔标志)中 - 当一个事件发生开始一个新活动,即在你的活动中点击一个按钮等时,在事件监听器中清除标志(设置为假) - 例如:按钮的onClickListener

这应该有效

答案 2 :(得分:0)

活动之间的转换如下:

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

您可以选择如何利用此功能。您可以子类化Application,并在应用程序类中保留一个布尔值。创建执行以下操作的基本活动:

  1. 在onPause()中,调用应用程序将布尔值更改为false。
  2. 在onResume()中,调用应用程序将布尔值更改为true。
  3. 在onStop()中,除非布尔值设置为true,否则调用应用程序停止音乐。
  4. 如果您的所有活动都扩展了此基本活动,那么这将有效。当A停止时,只要B是你的另一个活动,它就会恢复并将布尔值设置为true,这样你的音乐就会继续播放。

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

我所做的是: -

  1. 创建一个名为activityCount的公共静态int。
  2. 在每个活动的onCreate函数中,我将activityCount增加1。
  3. 我@Override public void finish()并将activityCount减1 并致电super.finish()。
  4. 如果activityCount == 1,则在onPause中暂停音乐。
  5. 在onResume中,如果activityCount == 1,播放音乐。
  6. 通过连续播放音乐,我可以获得所需的效果,但是当点击主页按钮时,音乐会停止,并在活动恢复后恢复。

    感谢所有建议,因为它帮助我更加逻辑地思考。