0

在 MainActivity 上,我使用 MediaPlayer 播放背景音乐。

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    Music.playBGmusic(this, R.raw.main_music);
}

@Override
protected void onResume() {
      super.onResume();
      if ( ! Music.isPlaying(this) )
      {
          Music.playBGmusic(this, R.raw.main_music);
      }
}

在 Music.java 中:

public class Music {
   private static MediaPlayer mMainSound = null;
   public static boolean isPlaying(Context context)
   {
       if ( mMainSound != null )
       {
           return mMainSound.isPlaying();
       }
       return false;
   }

   public static void playBGmusic(Context context, int resource)
   {
       if ( mMainSound != null ) mMainSound.release();
       mMainSound = MediaPlayer.create(context, resource);
       mMainSound.setLooping(true);
       mMainSound.start();
   }

   public static void stopBGmusic(Context context) {
       if (mMainSound != null) {
           mMainSound.stop();
           mMainSound.release();
           mMainSound = null;
       }
   }
}

mMainSoundMediaPlayer 对象在哪里。我的 MainActivity 上有一个按钮,当它被点击时,它会创建一个意图,并且startActivity那个意图。playBGmusic这个新活动以另一种声音呼唤。现在,当该新活动调用stopBGmusic() finish()返回 MainActivity 时,onResume()MainActivity 将按预期调用,并且它应该main_music在后台播放。实际发生的是,我只能听到不到一秒钟的音乐,然后就被切断了。我在启动 MediaPlayer 之前尝试过prepare(),但这仍然不能解决问题。如果有人能为我澄清这个问题,将不胜感激。

也许我还应该提到finish()新活动中调用的位置,尽管我不确定这是否重要..

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_BACK:
            showDialog(1);
        break;
    }
    return true;
}  

@Override
protected Dialog onCreateDialog(int id) { //id is ignored
    Dialog dialog = null;
    AlertDialog.Builder builder;
    builder = new AlertDialog.Builder(this);
    builder.setMessage(R.string.return_home)
           .setCancelable(true)
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   finish();
               }
           })
           .setNegativeButton(R.string.cancel, null);
    dialog = builder.create();
    return dialog;
}
4

1 回答 1

0

您应该真正绑定一个服务来控制 MediaPlayer,而不是让您的主要活动控制它。相反,它应该通过您将服务绑定到您的应用程序来控制服务。

简单地说(假设您想在退出应用程序时继续播放音乐):

当您播放音乐时,您希望在后台运行它并让您的应用程序控制(开始/停止/暂停)媒体播放器的状态。创建媒体播放器时,您从后台而不是前台播放。这允许您在用户运行您的服务时连续播放音乐。

通过捕获特定的意图过滤器,可以使用 PendingIntent 与您的服务进行通信来设置通信。我建议去谷歌开发网站做一些教程,尝试学习意图、意图过滤器/动作和服务,并了解活动和服务的生命周期。

要正确地做到这一点,您应该分配一些时间来研究/实验并了解 android。

于 2013-01-31T01:07:22.143 回答