java - 跨多个 Activity 的安卓背景音乐;如何捕捉主页按钮按下

标签 java android audio background-process

我想在我的应用程序后台播放音频文件。很容易。我希望音乐在我的应用程序中的 Activity 之间切换时持续播放,而不是停止或暂停。也相当简单,只需在 onCreate 方法中执行此操作即可完成:

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ...
      mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity);
      mp.setLooping(true);
      mp.start();
    }

问题?当我按下主页按钮时让音乐停止。

在用户按下后退按钮时关闭声音似乎很容易。这是我所拥有的并且效果很好:

    public void onPause() {

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

    super.onPause(); }

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

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

似乎在按下主页按钮时停止音乐的唯一方法是在 onPause 中使用非条件停止(),但这并不好,因为当我交换 Activity 与 Intent 时调用它,导致音乐在 Activity 之间结束是不好的。

我很难想象像背景音乐这样的常见功能有这么难,但我看到了一个接一个的帖子,都和我有同样的问题,除了那些会在应用程序内的 Activity 之间杀死音乐之外没有合适的答案.

Google Play 商店中的所有其他应用程序如何做到这一点,但网上似乎没有明确的答案?我可以在每次 onPause() 时停止并开始播放音乐,但这会导致音频出现不专业的间隙,更不用说它会一遍又一遍地从头开始播放背景音频,这是 Not Acceptable 。

最佳答案

我对 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 后立即将其设置为 false(在它们的 onCreate() 中)但它想要工作,可能是因为同时调用了来自 Main 的 onStop() 和来自其他人的 onCreate() (坦率地说,我现在还没有真正了解生命周期)。 每次启动 Main 的 onCreate() 时,只需将 shouldPlay 设置为 false 即可:

shouldPlay = false;

这对我来说很管用。 让我知道它是否适合你, 干杯,

关于java - 跨多个 Activity 的安卓背景音乐;如何捕捉主页按钮按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21591563/

相关文章:

java - 是否有可能通过包含消息的 messegaID 的 url 在 gmail 中显示消息?

java - 找不到“org.apache.commons.logging.impl.Log4JLogger”

android - 为什么从远程机器运行时 monkeyrunner 不工作?

java - Android Espresso - 关闭 SearchView

delphi - 使用 FFMPEG 减慢视频的音频速度

ios - 快速将 float 组写入 wav 音频文件

java - 如何在多个服务器上运行的应用程序之间共享文件

java - Univocity - 使用 RowWriterProcessor 写出引号转义字符

java - 没有标题问题的 fragment 对话框

asp.net - 使用 ASP.NET 关闭 Windows 声音