【问题标题】:Background music Android背景音乐安卓
【发布时间】:2011-10-28 11:47:22
【问题描述】:

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

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);

【问题讨论】:

  • 我看不出问题出在哪里...您不想一直在后台播放音乐吗?
  • 我想在应用程序运行时一直播放它,但是当我按下 Home 键时音乐仍然播放。

标签: android playback


【解决方案1】:

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

服务的概念是在后台运行;就背景而言,其含义通常是指您的应用 UI 不可见。没错,它可以像你一样使用(如果你记得停止它),但它就是不对的,它会消耗你不应该使用的资源。

如果您想在 activity 的后台执行任务,请使用 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);
}

这会起作用。

【讨论】:

  • 只有一个问题。我需要制作新课程 BackgroundSound 吗?或者把它放在 BackgroundSoundService 类下,或者把它放在我的主要活动类中?
  • 在您想要播放声音的活动课上。它必须是一个内部类。请记住将“YourActivity”(在代码中)更改为您的活动名称。
  • 我已经测试过了。当我启动应用程序时它会播放声音,但问题是当我按下 HOME 按钮时它仍然在应用程序关闭时播放音乐?
  • 在activity类下放onResume和onPause方法时,mBackgroundSound无法解析。
  • 确保将 mBackgroundSound 声明为活动类中的字段。
【解决方案2】:

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

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

这是 Android 开发者页面上关于 AsyncTasks 的几行代码

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

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

【讨论】:

    【解决方案3】:

    当然,您的服务在后台运行,当它进入后台时,您必须从您的活动中手动停止它。

    【讨论】:

      【解决方案4】:

      是的,当你按下主页按钮时,你应该停止服务。在 OnPause(){} 覆盖方法中,您应该停止音乐服务。在 OnDestroy() 方法的服务中,请停止媒体播放器。 所以现在,按下 home 调用 onPause 和 onPause() -> 停止服务并在服务中执行 OnDestroy,在 odestroy() 中停止媒体播放器并修复您的问题。

      【讨论】:

        【解决方案5】:

        在您的 on stop 方法中编写以下代码:

        系统。退出(0);

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

        【讨论】:

          【解决方案6】:

          尝试在 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();
                  }
              }
          }
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              (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()
              }
              

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-20
                  相关资源
                  最近更新 更多