Android Media Player在后台播放,但在应用程序被杀时不会停止

时间:2013-09-18 11:41:29

标签: android audio android-activity media-player

我是Android新手,所以我遇到了问题。在Android中,我想在我的音乐播放器启动后立即播放背景音乐,并且即使活动从一个变为另一个,它也会继续播放。我试过这段代码:

MediaPlayer music = MediaPlayer.create(MainActivity.this, R.drawable.bgscore);
music.start();

但是,当用户关闭应用程序时,声音应该停止,但事实并非如此。我怎样才能做到这一点?

10 个答案:

答案 0 :(得分:8)

创建一个单独的类来处理几个条件

import android.content.Context;
import android.media.MediaPlayer;
import android.util.Log;

public class MusicManager {
    static final int MUSIC_PREVIOUS = -1;
    private static final String TAG = "MusicManager";
    static MediaPlayer mp;
    private static int currentMusic = -1;
    private static int previousMusic = -1;


    public static void start(Context context, int music) {
        start(context, music, false);
    }

    public static void start(Context context, int music, boolean force) {
        if (!force && currentMusic > -1) {
// already playing some music and not forced to change
            return;
        }

        if (music == MUSIC_PREVIOUS) {
            Log.d(TAG, "Using previous music [" + previousMusic + "]");
            music = previousMusic;
        }
        if (currentMusic == music) {
// already playing this music
            return;
        }
        if (currentMusic != -1) {
            previousMusic = currentMusic;
            Log.d(TAG, "Previous music was [" + previousMusic + "]");
// playing some other music, pause it and change
            pause();
        }
        currentMusic = music;
        Log.d(TAG, "Current music is now [" + currentMusic + "]");
        if (mp != null) {
            if (!mp.isPlaying()) {
                mp.start();
            }
        } else {
            mp = MediaPlayer.create(context, R.raw.backGroundMusic); //Ur BackGround Music
        }

        if (mp == null) {
            Log.e(TAG, "player was not created successfully");
        } else {
            try {
                mp.setLooping(true);
                mp.start();
            } catch (Exception e) {
                Log.e(TAG, e.getMessage(), e);
            }
        }
    }

    public static void pause() {
        if (mp != null) {
            if (mp.isPlaying()) {
                mp.pause();
            }
        }

// previousMusic should always be something valid
        if (currentMusic != -1) {
            {
                previousMusic = currentMusic;
                Log.d(TAG, "Previous music was [" + previousMusic + "]");
            }
            currentMusic = -1;
            Log.d(TAG, "Current music is now [" + currentMusic + "]");
        }
    }

    public static void release() {
        Log.d(TAG, "Releasing media players");
        try {
            if (mp != null) {
                if (mp.isPlaying()) {
                    mp.stop();
                }
                mp.release();
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
        }

        if (currentMusic != -1) {
            previousMusic = currentMusic;
            Log.d(TAG, "Previous music was [" + previousMusic + "]");
        }
        currentMusic = -1;
        Log.d(TAG, "Current music is now [" + currentMusic + "]");
    }
}

然后在MainActivity中定义一个全局布尔变量,并在true中的setContentView(....)之前将其设置为onCreate(),即

    boolean continueBGMusic;
    ....
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        continueBGMusic=true;
    setContentView(R.layout.activity_main);
    .....
    }

然后将onPause()更新为

    public void onPause()
        {
            super.onPause();
            if(!continueBGMusic)
                MusicManager.pause();
    }

onResume()

    public void onResume()
        {
            super.onResume();

                continueBGMusic=false;
                MusicManager.start(this,R.raw.backGroundMusic);
    }

使用布尔变量和两种方法更新所有三个活动。

答案 1 :(得分:3)

试试这个

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        music.stop();
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

否则如果您有任何单独的按钮操作来关闭应用程序,那么你可以调用music.stop();

答案 2 :(得分:3)

如果你没有太多的活动, 您可以通过在活动中添加布尔标志来管理此任务,您可以在其中播放音乐 当您停止一个活动时,这些标志将显示,其他活动是否需要您的MediaPlayer

所以在你的主要活动中:

public class MainActivity extends Activity {

    static MediaPlayer introPlayer;
    static boolean sActive;

    @Override
    protected void onResume() {

    // starting the player if it is not playing
        if (!introPlayer.isPlaying()) {
            introPlayer.start();
            introPlayer.setLooping(true);
        }

        // true when activity is active
        sActive = true;
        super.onResume();
    }

    @Override
    protected void onPause() {

        sActive = false;
        super.onPause();
    }

    @Override
    protected void onStop() {

        // before stoping mediaplayer checking whether it is not used by other          activities

        if (introPlayer.isPlaying()
                && !(Activity2.sActive || Activity3.sActive)) {
            introPlayer.pause();
        }

        super.onStop();

    }
}

其他活动:

public class Activity2 extends Activity {

    static boolean sActive;

    @Override
    protected void onPause() {
        sActive = false;

        super.onPause();
    }

    @Override
    protected void onStop() {

        // pausing the player in case of exiting from the app
        if (MainActivity.introPlayer.isPlaying() && !(MainActivity.sActive || Activity3.sActive)) {
            MainActivity.introPlayer.pause();
        }

        super.onStop();
    }

    @Override
    protected void onResume() {
        sActive = true;

        if (!MainActivity.introPlayer.isPlaying()) {
            MainActivity.introPlayer.start();
            MainActivity.introPlayer.setLooping(true);
        }

        super.onResume();
        }
}

public class Activity3 extends Activity {

    static boolean sActive;

    @Override
    protected void onPause() {
        sActive = false;

        super.onPause();
    }

    @Override
    protected void onStop() {

        // pausing the player in case of exiting from the app
        if (MainActivity.introPlayer.isPlaying() && !(MainActivity.sActive || Activity2.sActive)) {
            MainActivity.introPlayer.pause();
        }

        super.onStop();
    }

    @Override
    protected void onResume() {
        sActive = true;

        if (!MainActivity.introPlayer.isPlaying()) {
            MainActivity.introPlayer.start();
            MainActivity.introPlayer.setLooping(true);
        }

        super.onResume();
        }
}

答案 3 :(得分:0)

只要您离开应用程序,就必须简单地调用music.stop()。如果您的应用只包含一项活动,则可以在启动器活动的onStop()方法中执行此操作。

如果您想要有效地播放声音,我建议您使用 SoundPool 。使用它你可以播放大量的并发声音。我还制作了SoundPool的演示项目。你可以找到它here

使用MediaPlayer对象时,您必须自己管理所有内容。我在第一场比赛中也使用了同样的方法。但是现在我的新游戏我正在使用SoundPool。它被添加到API 1 n静止岩石中。

答案 4 :(得分:0)

我通过以下方式做到了这一点

初始化

    MediaPlayer player;
    Music music;
在OnCreate中

    music = new Music();
    music.execute("abc");

当你想要停止音乐时,通常是在onDestroy方法

        music.cancel(true);
        if(player.isPlaying()){
        player.stop();
        player.release();
        }

创建音乐课

  public class Music extends AsyncTask<String, Integer, Void>
{

    @Override
    protected Void doInBackground(String... params) {

        if(running)
        {
        player = MediaPlayer.create(getApplicationContext(), R.raw.bg_music1); 
        player.setVolume(100,100); 
        player.setLooping(true); 
        player.start(); 
        }
        else
        {
            player.stop();
            player.release();
        }
        return null;
    }

    @Override
    protected void onCancelled() {
        // TODO Auto-generated method stub
        super.onCancelled();
        running = false;
    }
}

另一种方法是使用服务

答案 5 :(得分:0)

非常简单,当你想要关闭MediaPlayer卷时,尝试使用setVolume设置(int leftVolume,int RightVolume)

因此,每当您想要停止MediaPlayer的音量时。使用

music.setVolume(0,0);

即使您可以暂停使用music.pause();

停止MediaPlayer

使用music.stop();

停止媒体播放器

答案 6 :(得分:0)

查看@ ActivityLifecycleCallbacks并跟踪活动的开始和停止,以了解您的应用何时“停止”。这是一个调用进入onActivityStopped而不是在一小段时间内调用onActivityStarted的时候。

答案 7 :(得分:0)

最简单的解决方案是进入您的Android设置&gt;应用&gt; (音乐播放器的名称),然后点击“强制停止”。确认操作,音乐应该停止。它可能不适用于所有音乐播放器,但它值得一试。

如果您必须拥有代码,是否尝试过分配music.pause()?此命令将停止播放音乐。

答案 8 :(得分:0)

要开始播放音乐,您需要弄清楚我们的应用程序何时开始播放。我们可以通过扩展Application类来做到这一点。应用程序对象在任何活动之前进行实例化,并保留到我们的应用程序被Android操作系统终止之前。 这使得理想的是仅在该对象内控制回放。当我们创建扩展Application的新类时,我们必须将它注册到我们的清单中。

我们已经确定我们的应用程序何时创建但是当我们的应用程序从前台到后台时停止音乐呢? Android没有提供开箱即用的方法来确定。为了解决这个问题,我遵循了very good article,部分解决方案代码来自那里。

申请代码:

package com.example.stackmusic; 

import android.app.Activity;
import android.app.Application;
import android.media.MediaPlayer;
import android.os.Bundle;


public class PlayMusicApp extends Application {


private MediaPlayer music;
@Override
public void onCreate() {
    super.onCreate();
    registerActivityLifecycleCallbacks(new MyLifecycleHandler());

    music = MediaPlayer.create(this, R.raw.some_music);
}

/**
 * All activities created in our application will call these methods on their respective
 * lifecycle methods.
 */
class MyLifecycleHandler implements ActivityLifecycleCallbacks {

    private int resumed;
    private int stopped;

    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    }

    public void onActivityDestroyed(Activity activity) {
    }

    public void onActivityResumed(Activity activity) {
        // this is the first activity created
        if(resumed == 0) {
            music.start();
        }
        ++resumed;
    }

    public void onActivityPaused(Activity activity) {
    }

    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    }

    public void onActivityStarted(Activity activity) {
    }

    public void onActivityStopped(Activity activity) {
        ++stopped;
        android.util.Log.w("test", "application is being backgrounded: " + (resumed == stopped));
        // we are stopping the last visible activity
        if(resumed == stopped) {
            music.stop();
        }
    }
  }
}

在清单中注册:

<application
    android:name=".PlayMusicApp"

您不想在UI线程中播放音乐。理想情况下,创建用于在后台线程中播放音乐的服务,而不是在Application对象中管理媒体播放器。

答案 9 :(得分:0)

要停止播放歌曲,您可以在Destroy上执行music.stop()。表示当您的应用关闭或被杀时音乐会停止

@Override
protected void onDestroy() {
    music.stop();
    super.onDestroy();
}