跨多种活动的Android背景音乐;如何抓住Home按钮

时间:2014-02-06 00:23:42

标签: java android audio background-process

我想在我的应用程序的后台播放音频文件。很容易。我希望音乐能够持续存在,而不是在我的应用中的活动之间切换时停止或暂停。通过在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按钮的按下。如果按下主页按钮,即使用户不再看到我的应用程序,音乐也会继续播放。

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

按下Home按钮时杀死音乐的唯一方法是在onPause中使用非条件停止(),但这并不好,因为当我用意图交换活动时会调用它,导致音乐在不合适的活动之间结束。

我很难想象像背景音乐这样的常见功能是如此困难,但是我发布的帖子跟帖子一样跟我有同样的问题而且没有正确的答案,除了那些会在app中的活动之间杀死音乐的答案

Google Play商店中的所有其他应用如何实现这一目标,但网上似乎没有明确答案?我可以用每个onPause()来停止和启动音乐,但这会导致音频中不专业的差距,更不用说它会一次又一次地从头开始启动背景音频,这是不可接受的。

2 个答案:

答案 0 :(得分:1)

我对Android编程有点新鲜(几个月),今天我遇到了同样的问题(也许你还在做什么?)

我使其工作如下:

假设我有MainActivity,而在MainActivity中我有Btn2导致SecondActivity,而Btn3导致ThirdActivity。

我在MainActivity的开头宣布:

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;
    }
}

如果boolean shouldPlay设置为true,那么我的onStop()不会被完全调用,我的音乐也不会关闭。然后,我必须决定何时将其设置为true。当我从MainActivity切换到SecondActivity时,我是通过Intent完成的,当我将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但它想要工作,可能因为来自Main的onStop()和来自其他人的onCreate()被同时调用(坦白说,我现在真的没有生命周期)。 只要我们每次启动Main的onCreate()时都将shouldPlay设置为false:

shouldPlay = false;

这适合我。 让我知道它是否适合你, 干杯, BRO。

答案 1 :(得分:0)

@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 +,请阅读: Capture Home Key Event

尝试使用后退按钮:

@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(this.isFinishing()){  //INCORRECT, Here you are pausing you activity not finishing.
        mp.stop();
      }
    super.onPause(); 
}

所以改为:

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

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