使用布尔标志控制MediaPlayer行为

时间:2012-12-29 20:46:07

标签: android

我的应用使用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.

1 个答案:

答案 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,音乐就会继续播放。

我意识到可以使用服务来实现类似的结果,并且我鼓励每个人都在考虑这个问题。但考虑到我的编程背景和对自定义服务的不熟悉,这个解决方案对我来说最有意义。