背景音乐Android

时间:2011-10-28 11:47:23

标签: android playback

哦,这是我的问题。我有一个服务类,我设法创建媒体播放器,以便在后台播放音乐。这是代码:

package com.test.brzoracunanje;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class BackgroundSoundService extends Service {
private static final String TAG = null;
MediaPlayer player;
public IBinder onBind(Intent arg0) {

    return null;
}
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
       player = MediaPlayer.create(this, R.raw.test_cbr);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);
        player.start();
}
@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
}
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
}

protected void onNewIntent() {
    player.pause();
}
}

但是现在点击HOMEBACK按钮时出现问题。它仍然播放音乐。有谁知道如何解决这个问题?

以下是代码如何在我想播放音乐的课堂上调用此服务;

  Intent svc=new Intent(this, BackgroundSoundService.class);
    startService(svc);

9 个答案:

答案 0 :(得分:25)

如果您只想为您的应用播放背景音乐,请在从您的app /使用AsyncTask类启动的线程中播放它,为您完成。

服务的概念是在后台运行;通过背景,通常意味着您的应用UI 不可见。是的,它可以像你一样使用(如果你记得停止它),但它不正确,它消耗你不应该使用的资源。

如果您想在活动的背景下执行任务,请使用AsyncTask。

顺便说一下,onStart已被弃用。使用服务时,请实施onStartCommand

<强>更新

我认为此代码适合您。添加此类(包含在您的活动类中)。

public class BackgroundSound extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        MediaPlayer player = MediaPlayer.create(YourActivity.this, R.raw.test_cbr); 
        player.setLooping(true); // Set looping 
        player.setVolume(1.0f, 1.0f); 
        player.start(); 

        return null;
    }

}

现在,为了控制音乐,请保存BackgroundSound对象,而不是匿名创建它。将其声明为您活动中的字段:

BackgroundSound mBackgroundSound = new BackgroundSound();

在你的活动的onResume方法上,启动它:

public void onResume() {
    super.onResume();
    mBackgroundSound.execute(null);
}

在你的活动的onPause方法中,停止它:

public void onPause() {
    super.onPause();
    mBackgroundSound.cancel(true);
}

这样可行。

答案 1 :(得分:1)

AsyncTasks仅适用于非常短的剪辑,但如果它是音乐文件,您将面临以下问题:

  • 您将无法在中间停止/暂停音乐。对我来说这是一个真正的问题。

以下是Android开发者页面中关于AsyncTasks

的几行内容
  

理想情况下,AsyncTasks应该用于短时间操作(几秒钟)   最多。)如果你需要保持线程长时间运行   时间,强烈建议您使用提供的各种API   java.util.concurrent包,例如Executor,ThreadPoolExecutor   和FutureTask。

所以目前我正在寻找其他选项并在找到解决方案后更新答案。

答案 2 :(得分:0)

当然,您的服务是在后台运行的,当您转到后台时,您必须手动停止它。

答案 3 :(得分:0)

是的,当你按下主页按钮时,你应该停止服务。在OnPause(){}覆盖方法中,你应该停止音乐服务。在OnDestroy()方法的服务内部,请停止媒体播放器。 所以现在,按家庭电话onPause和onPause() - &gt;停止服务,OnDestroy在服务中执行,在odestroy()中媒体播放器停止,问题得到解决。

答案 4 :(得分:0)

在你的停止方法中写下以下代码:

系统。出口(0);

当您按回/主页按钮或关闭应用程序时,这将终止您的媒体播放器

答案 5 :(得分:0)

尝试按住以在HOME或BACK按下停止背景音乐。

@Override
protected void onStop() {
    super.onStop();
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> services = activityManager
            .getRunningTasks(Integer.MAX_VALUE);
    boolean isActivityFound = false;

    if (services.get(0).topActivity.getPackageName().toString()
            .equalsIgnoreCase(getPackageName().toString())) {
        isActivityFound = true; // Activity belongs to your app is in foreground.
    }

    if (!isActivityFound) {
        if (player != null && player.isPlaying()) {
            player.release();
        }
    }
}

答案 6 :(得分:0)

尝试在onDestroy()方法中插入player.stop()。它应该有所帮助。

答案 7 :(得分:0)

(Kotlin)可悲地Jong's answer没有为我工作,我有一些错误,包括:MediaPlayer finalized without being released和延迟停止和启动声音。所以我会发布我做的方式,以防其他人遇到同样的问题。我BackgroundSound的实现仍使用AsyncTaskMediaPlayer,但它是非嵌套类。

class BackgroundSound : AsyncTask<Context, Void?, Void?>() {

    override fun doInBackground(vararg params: Context): Void? {
        val player = MediaPlayer.create(params[0], R.raw.msc_background)
        player.isLooping = true
        player.start()

        while (!isCancelled) {
        }

        player.stop()
        player.release()

        return null
    }
}

您可以在Activity中使用此类,如下所示:

private var backgroundSound: BackgroundSound? = null

override fun onResume() {
    super.onResume()
    backgroundSound = BackgroundSound()
    backgroundSound!!.execute(this)
}

override fun onPause() {
    backgroundSound?.cancel(true)
    super.onPause()
}

答案 8 :(得分:0)

尝试在启动服务的活动的stopService(svc)方法中插入onDestroy()。它对我有用。

相关问题