Java Android在多个活动中播放背景音乐;如何抓住主页按钮按下

Java Android在多个活动中播放背景音乐;如何抓住主页按钮按下,java,android,audio,background-process,Java,Android,Audio,Background Process,我想在我的应用程序的后台播放音频文件。很简单。我希望音乐能够持续播放,在我的应用程序中切换活动时不会停止或暂停。也非常简单,只需在onCreate方法中执行此操作即可完成: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... mp = MediaPlayer.create(MainActivity.this, R.raw

我想在我的应用程序的后台播放音频文件。很简单。我希望音乐能够持续播放,在我的应用程序中切换活动时不会停止或暂停。也非常简单,只需在onCreate方法中执行此操作即可完成:

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ...
      mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity);
      mp.setLooping(true);
      mp.start();
    }
问题出在哪里?按下HOME(主页)按钮时停止播放音乐。

当用户按下后退按钮时消除声音似乎很容易。以下是我的建议,效果非常好:

    public void onPause() {

      if(this.isFinishing()){  //BACK was pressed from this activity
        mp.stop();
      }

    super.onPause(); }
不复杂,但这不会捕捉到按下HOME(主页)按钮。如果按下Home(主页)按钮,即使用户不再看到我的应用程序,音乐也会继续播放

我看到的答案涉及在清单中设置权限以获取我不应该执行的任务,并且对用户来说似乎很危险。除此之外,这个解决方案甚至不起作用。我见过涉及使用服务的解决方案,但这些都不起作用,因为home按钮仍然像以前一样播放音乐,因为似乎没有办法捕捉它,也没有“完成”应用程序(更不用说每次有人建议使用服务来完成此任务时,都会有多人进来并声明这不是服务的正确使用)

当按下Home(主页)按钮时,停止音乐的唯一方法似乎是在onPause中使用无条件的stop(),但这不好,因为当我将活动与意图交换时,会调用该函数,导致音乐在活动之间结束,这是不好的。

我很难想象像背景音乐这样的普通功能有这么难,但我看到过一篇又一篇文章,都有和我一样的问题,除了那些会在应用程序中的活动之间扼杀音乐的问题外,没有其他合适的答案

Google play store上的所有其他应用程序是如何做到这一点的,但在线上似乎没有明确的答案?我可以用每个onPause()停止并启动音乐,但这会导致音频出现不专业的缺口,更不用说它会一次又一次地启动背景音频,这是不可接受的

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_HOME){
        Log.d("Jorgesys", "Home button pressed!!!");
    }
    return super.onKeyDown(keyCode, event);
}
但是,嘿!从4.0+开始,这不再有效,请阅读:

尝试使用“后退”按钮:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        Log.d("Jorgesys", "Back button pressed!!!");
    }
    return super.onKeyDown(keyCode, event);
}
要停止媒体播放器,请使用以下方法:

isFinishing()
:如果活动正在完成,则返回true;否则返回 返回false,但您只是暂停活动,而不是完成任务 活动

因此,请改为:

public void onPause() {
    if(mp.isPlaying())
      {
       mp.stop();
      }
    super.onPause(); 
}

当您的活动处于暂停状态时,评估您的MediaPlayer是否正在播放,如果这是真的,则停止音频。

我对Android编程有点陌生(几个月),今天,我遇到了与您相同的问题(也许您现在仍然这样做?)

我的工作如下:

假设我有MainActivity,在MainActivity中我有Btn2,它导致第二个Activity,Btn3导致第三个Activity

我在活动开始时声明:

public static boolean shouldPlay = false;
然后我实现了我的onStop()方法:

public void onStop() {
    super.onStop();
    if (!shouldPlay) { // it won't pause music if shouldPlay is true
        player.pause();
        player = null;
    }
}
如果布尔shouldPlay设置为true,则不会完全调用我的onStop(),也不会关闭我的音乐。然后,我必须决定何时将其设置为true。当我从MainActivity切换到SecondActivity时,我会通过一个意图来执行此操作,此时我将shouldPlay设置为true:

Button Btn2 = (Button) findViewById(R.id.Btn2);
    Btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            shouldPlay = true;
            startActivity(intent);
        }
    });
Btn3也是如此

现在,我们最不希望看到的是,如果我在访问SecondActivity或ThirdActivity后返回MainActivity,那么shouldPlay将被设置为true。我尝试的第一件事是在调用Second和ThirdActivity(在onCreate()中)时将其设置为false,但它想工作,可能是因为onStop()命令from Main和onCreate()是同时调用的(坦白地说,我现在还没有真正了解生命周期)。 每次启动Main的onCreate()时,只需将shouldPlay设置为false即可:

shouldPlay = false;
这对我来说很合适。 如果对你有好处,请告诉我, 干杯
兄弟。

这不是一个特别简单的问题。根据我的经验,大多数应用程序都有“背景音乐”是游戏,并且使用不涉及多种活动的框架编写。或者,它们是音乐播放器,并且它们特别希望在后台继续播放。我不能说我见过任何具有您所寻求的行为的非游戏应用程序。有一条建议是,音乐播放应由服务管理,而不是由活动管理,如果音乐应该覆盖你的所有活动。在许多其他类似于我自己的帖子中,有人在帖子中说服务不应该用于应用程序内背景音乐之类的东西。也许我应该忽略这些警告?即使我使用服务,我也会仍然需要一种方法来捕捉按下Home(主页)按钮以结束服务,我发现自己的情况与我现在所处的完全相同,不幸的是,因为服务需要明确结束正确吗?谢谢你提供的信息,但我已经处理了back(返回)按钮的按下,我唯一真正关心的是如何停止播放音乐n按下主页按钮。如果谷歌已经取消了检测此按钮的功能(为什么?谢谢链接)我不知道如何停止音乐。许多用户会对一个应用程序感到恼火,该应用程序在使用“主页”按钮最小化时仍会播放背景音乐,我正在尽我所能争取良好的用户体验。太棒了!我真的放弃了这一点,你的解决方案听起来很棒!我希望我已经想到了这一点!
shouldPlay = false;