Android停止背景音乐

Mik*_*ike 26 android background media-player

编辑 - 找到一个简单的5-10线解决方案!看下面我自己的答案!好极了!!!!!!!!!

我搜索了5个小时,数十个SO帖子,没有答案,这似乎是最简单明显的怪异事!

编辑顺便说一句,这不是一个音乐播放器的应用程序,只是一个应用程序来查看图片和文本,打开多个活动,如菜单和关于,查看差异类型的图片等.我只想播放一些简单的背景音乐,同时通过图片看和文字,为什么这么难?

另一个编辑 - 似乎主要的问题是:"为什么按下主页按钮不打开onPause或onStop ???" - 我可以知道何时停止媒体播放器?我在市场上下载的游戏怎么做到这个???

家庭活动开始

然后

媒体播放器开始:

player = MediaPlayer.create(this, R.raw.idil);
player.setLooping(true);
player.setVolume(100,100);
player.start();
Run Code Online (Sandbox Code Playgroud)

玩家在onCreate之外宣布

MediaPlayer player;
Run Code Online (Sandbox Code Playgroud)

当其他活动被打开时,背景音乐继续不间断,这很好,这就是我想要的.

现在,当我完成了我非常简单的应用程序(只显示差异活动中的一些图片和文本)时,我要么多次单击BACK以进入主页/原始活动,然后又一次"退出",或者,我只是按回家"退出",因为我已经完成了这个应用程序,我不再需要听到那个音乐了.


选项1

通话player.stop();中的onPause覆盖,这是不是我想要的,因为当我离开家的活动像"菜单"和"约",我也没有什么用暂停和打开新的活动的时候,因为我做恢复等活动的背景音乐停止不希望漂亮的背景音乐"跳过"或被打断.


方案2

@Override
    protected void onPause() {
        super.onPause();
        if (this.isFinishing()){
            player.stop();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是更好的,因为背景音乐不会在活动之间停止,当我从我的家庭活动按BACK时,音乐停止,我可以继续享受安卓的安卓手机,问题是,当按下HOME时按钮"退出"我的应用程序,那讨厌的背景音乐继续播放.


奇怪

@Override
protected void onStop() {
        super.onStop();
        if (this.isFinishing()){
            player.stop();
        }
    }
Run Code Online (Sandbox Code Playgroud)

与onPause相同(我确实理解实际的差异)

编辑 - 这似乎没关系,如果player.stop(); 高于或低于super.onStop(); 但它影响我无法看到的东西,无论哪种方式,仍然没有解决方案:(

OOOOO

OOOOO

编辑 - 另一个选项 - 但不工作

public void onUserLeaveHint() {
    player.stop();
    super.onUserLeaveHint();
}
Run Code Online (Sandbox Code Playgroud)

这会在我按HOME时停止音乐,但是当我开始新的活动时它也会停止:(

编辑 - 我看到多个地方非常常见的工作,但似乎很荒谬:

essentialy保持已经打开和关闭的活动数量的计数(onResume和onPause可能是最好的,但这点不相关),当该计数达到0时,停止背景音乐.是的,这很简单,但为什么我必须以编程方式执行此操作,实际上这个帖子的最大问题是:

为什么按下主页按钮不打开onPause或onStop ???

将它放入onDestroy不是一个选项,因为onDestroy仅在系统内存不足时调用,或者您强行关闭应用程序,并且有详细记录.

覆盖HOME按钮也是没有选择,因为我已经读过它"不可能"而且我已经读过它"非常不满意",无论哪种方式我都避免这样做.

我没有看到创建SERVICE的必要性,即使我这样做,我何时会停止服务,似乎我会遇到同样的问题

现在,这完全打动了我的想法,我从Android市场下载的每个游戏和每个应用程序都有非常漂亮的背景音乐,当我按BACK或HOME因为我完成了那个可爱的游戏,音乐停止了,而不是保持在后台玩.

我非常沮丧,我觉得这是因为我觉得我错过了一些非常简单的东西,因为这是任何应用程序最基本的生命周期问题之一.

我花了一个月的时间阅读developer.android.com的每一页,包括开发指南,教程,示例项目和研究参考部分,以及谷歌这个主题5个小时.

我也不明白为什么6或7个具有完全相同问题的SO线程尚未得到解答,市场上的每个可下载应用程序在您按HOME或BACK或其他任何内容时都停止播放其音乐(除非它是背景音乐播放器) "退出"应用程序以在手机上执行其他操作.

我错过了什么?

Mik*_*ike 22

我今天很开心,还有头发:)我已经测试了这个并且它有效!

首先,将此添加到您的清单中:

<uses-permission android:name="android.permission.GET_TASKS"/>
Run Code Online (Sandbox Code Playgroud)

其次,将其添加到"Home/Main"活动/班级:

  @Override
  protected void onPause() {
    if (this.isFinishing()){ //basically BACK was pressed from this activity
      player.stop();
      Toast.makeText(xYourClassNamex.this, "YOU PRESSED BACK FROM YOUR 'HOME/MAIN' ACTIVITY", Toast.LENGTH_SHORT).show();
    }
    Context context = getApplicationContext();
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
    if (!taskInfo.isEmpty()) {
      ComponentName topActivity = taskInfo.get(0).topActivity; 
      if (!topActivity.getPackageName().equals(context.getPackageName())) {
        player.stop();
        Toast.makeText(xYourClassNamex.this, "YOU LEFT YOUR APP", Toast.LENGTH_SHORT).show();
      }
      else {
        Toast.makeText(xYourClassNamex.this, "YOU SWITCHED ACTIVITIES WITHIN YOUR APP", Toast.LENGTH_SHORT).show();
      }
    }
    super.onPause();
  }
Run Code Online (Sandbox Code Playgroud)

显然,用你的类名替换xYourClassNamex :)

现在显然你不需要"Toasts"但它会告诉你发生了什么.非常有趣的是当你从'Home/Main'活动中按BACK时,你显然会得到2个Toast,"你从你的'主页/主要'活动中回来了",而第二个Toast是"你在你的应用程序中切换的活动" ".我相信我知道为什么会这样,但事实并非如此,因为我称之为"player.stop();" 来自2个场景,这意味着我的应用程序不再被"使用".显然比"player.stop();"做更多的工作 如果你需要:)而且显而易见你不需要"你在你的应用程序中切换活动"的"其他",因为没有理由"停止/暂停"背景音乐,这是我需要的,但如果你新活动开始时需要做点什么,好吧,你去吧:)

希望这有助于任何想知道用户"离开/退出/完成"应用程序的人:)

感谢所有评论的帖子,并帮助每个人!好极了!

编辑-

这部分必须在每个活动的onPause:

Context context = getApplicationContext();
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        if (!taskInfo.isEmpty()) {
          ComponentName topActivity = taskInfo.get(0).topActivity; 
          if (!topActivity.getPackageName().equals(context.getPackageName())) {
            player.stop();
            Toast.makeText(xYourClassNamex.this, "YOU LEFT YOUR APP", Toast.LENGTH_SHORT).show();
          }
        }
Run Code Online (Sandbox Code Playgroud)

因此,您将知道用户是否从任何活动中删除了您的应用.这很好知道:)