0

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

1 回答 1

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 的值。首先,由于 Activity 正在停止,我们减少 activitesPlaying。如果它 <= 0,则暂停音乐播放,并且为了做家务,将 activityPlaying 设置回 0,以防由于某种原因它被设置为负值。这可能不是必需的,而是及时缝合等等。

public void onStop(){
    super.onStop();

    GlobalVariables.activitiesPlaying--;

    if(GlobalVariables.activitiesPlaying <= 0){
        GlobalVariables.activitiesPlaying = 0;
        GlobalVariables.mPlayer.pause();
    }
}

由于活动生命周期的顺序,不可能像我上面尝试的那样只使用布尔值,因为它将在下一个活动启动时设置为 true,但在检查之前将设置为 false MediaPlayer 应该继续播放。但是,使用整数值会使这个决定更加灵活,因为只要它大于 0,音乐就会继续播放。

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

于 2012-12-31T17:59:29.963 回答