我的应用使用MediaPlayer对象播放背景音乐。我将它与其他名为的全局变量一起存储在.java文件中 - 还有什么? - GlobalVariables,所以为了访问它和其他变量,我使用这个调用:
GlobalVariables.mPlayer
我希望MediaPlayer在我的应用中的“活动”之间切换时继续播放音频,但是在应用失去焦点时暂停播放。为了尝试实现这一点,我声明了一个名为keepPlaying的布尔值,它也存储在GlobalVariables中,以便应用程序中的所有活动都可以访问它。我的想法是每次调用onStop()时都要让Activity检查boolean标志,如果发现keepPlaying = false,则暂停播放,否则什么都不做(保持播放)。我在每次startActivity()调用之前将标志设置为true,并在每次onResume()调用中将其设置为false。
如果我正确理解了Activity生命周期,当切换活动时,我的应用程序将首先调用当前的OnStop()。所以首先我将keepPlaying设置为true,然后调用onStop()。该方法包括三行:
super.onStop();
if(GlobalVariables.keepPlaying == false)
GlobalVariables.mPlayer.pause();
所以每当我进行startActivity调用时应该继续播放,但是当我最小化应用时暂停播放。然后,在下一个Activity的onResume()方法中,我将标志设置为false:
if(GlobalVariables.keepPlaying == true){
GlobalVariables.keepPlaying = false;
}else{
GlobalVariables.mPlayer.start();
然而,应用程序的行为并不像我想要的那样。切换活动时,它仍会暂停音频播放。我已经尝试为keepPlaying标志创建getter和setter方法,但是还没有修复它,所以我知道这不是访问问题。
任何人都可以想到为什么这种方法不起作用或我如何解决它?
谢谢!
[编辑]根据要求,这是一个更完整的代码示例。我现在无法访问自己的计算机,但这应该是一个精确的重新创建。假设所有必要的进口。
public class GlobalVariables{
public boolean keepPlaying;
public MediaPlayer mPlayer;
// Getter and setter methods, found to be unnecessary
public void setKeepPlaying(boolean input){keepPlaying = input;}
public boolean getKeepPlaying(){return keepPlaying;}
}
// First activity. Music plays after starting Activity, as expected.
public class FirstActivity extends Activity{
@Override
public void onCreate(...){
super.onCreate(...);
GlobalVariables.keepPlaying = false;
GlobalVariables.mPlayer.create(this, R.raw.music);
}
@Override
public void onStop(){
super.onStop();
// Check to see if we want to stop audio playback
if(GlobalVariables.keepPlaying == false){
GlobalVariables.mPlayer.pause();
}
@Override
public void onResume(){
super.onResume();
// If audio is already playing, set keepPlaying to false. Otherwise, start audio playback.
if(GlobalVariables.keepPlaying == true) //Thus audio is playing
GlobalVariables.keepPlaying = false;
else
GlobalVariables.mPlayer.start();
}
public void launchNextActivity(){
GlobalVariables.keepPlaying = true;
startActivity(new Intent(FirstActivity.this, SecondActivity.class));
}
}
Code for SecondActivity is the same as FirstActivity. When starting SecondActivity, the music abruptly stops. When hiding the app and resuming it, the music begins playing again.
答案 0 :(得分:0)
我提出了一个不涉及服务的解决方案 - 对于一个简单的小应用程序,这非常合适。
您需要创建一个公共int变量,用于跟踪要为MediaPlayer播放音乐的活动数量,这是通过将其放在名为GlobalVariables的.java文件中实现的:
public int activitiesPlaying;
确保将此int初始化为0.在我的情况下,我在主菜单Activity的onStart()方法中执行了此步骤,以便返回主菜单停止音乐。
GlobalVariables.activitiesPlaying = 0;
从那时起,只需要为每个要播放音乐的Activity操作每个Activity的onStart()和onStop()方法。在我的情况下,音乐应该在Activity开始时播放,所以onStart()非常简单:
public void onStart(){
super.onStart();
GlobalVariables.activitiesPlaying++;
GlobalVariables.mPlayer.start(); // MediaPlayer is stored in GlobalVariables
}
onStop()类似,但需要检查ActivitiesPlaying的值。首先,由于活动正在停止,我们减少活动播种。如果它< = 0,暂停音乐播放,并进行内务处理,请将活动设置回0,以防由于某种原因设置为负值。它可能没有必要,但是时间上的缝合和所有这些。
public void onStop(){
super.onStop();
GlobalVariables.activitiesPlaying--;
if(GlobalVariables.activitiesPlaying <= 0){
GlobalVariables.activitiesPlaying = 0;
GlobalVariables.mPlayer.pause();
}
}
由于活动生命周期的顺序,我不可能只使用上面尝试的布尔值,因为在下一个活动开始时它将被设置为true,但将被设置为false在检查之前看看MediaPlayer是否应该继续播放。但是,使用整数值可以使此决定更加灵活,因为只要它大于0,音乐就会继续播放。
我意识到可以使用服务来实现类似的结果,并且我鼓励每个人都在考虑这个问题。但考虑到我的编程背景和对自定义服务的不熟悉,这个解决方案对我来说最有意义。