我的应用使用 MediaPlayer 对象播放背景音乐。我将它与其他名为的全局变量一起存储在 .java 文件中 - 还有什么?- GlobalVariables,所以要访问它和其他变量,我使用这个调用:
GlobalVariables.mPlayer
我想让 MediaPlayer 在我的应用程序中的活动之间切换时继续播放音频,但在应用程序失去焦点时暂停。为了尝试实现这一点,我声明了一个名为 keepPlaying 的布尔值,它也存储在 GlobalVariables 中,以便应用程序中的所有活动都可以访问它。这个想法是让 Activity 在每次调用 onStop() 时检查布尔标志,如果发现 keepPlaying = false,则暂停播放,否则什么也不做(继续播放)。我在每次 startActivity() 调用之前将标志设置为 true,并在每次 onResume() 调用中将其设置为 false。
如果我正确理解了 Activity 生命周期,则在切换 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.