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();
}
}
但是现在点击HOME
或BACK
按钮时出现问题。它仍然播放音乐。有谁知道如何解决这个问题?
以下是代码如何在我想播放音乐的课堂上调用此服务;
Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc);
答案 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)
答案 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)
MediaPlayer finalized without being released
和延迟停止和启动声音。所以我会发布我做的方式,以防其他人遇到同样的问题。我BackgroundSound
的实现仍使用AsyncTask和MediaPlayer,但它是非嵌套类。
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()
。它对我有用。