我使用服务在所有活动中播放背景音乐并且它有效。问题是即使我的应用程序处于后台(当用户退出主页按钮或后退按钮时),音乐仍会继续播放。我该如何解决这个问题?
服务类BackgroundSoundService
public class BackgroundSoundService extends Service {
private static final String TAG = null;
MediaPlayer player;
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.slow_shock);
player.setLooping(true); // Set looping
player.setVolume(100,100);
}
public int onStartCommand(Intent intent, int flags, int startId) {
player.start();
return START_NOT_STICKY;
}
public void onStart(Intent intent, int startId) {
// TO DO
}
public IBinder onUnBind(Intent arg0) {
// TO DO Auto-generated method
return null;
}
public void onStop() {
}
public void onPause() {
}
@Override
public void onDestroy() {
player.stop();
player.release();
}
@Override
public void onLowMemory() {
}
}
从
开始Intent svc = new Intent(this, BackgroundSoundService.class);
startService(svc);
Android Manifest:
<service android:enabled="true" android:name=".BackgroundSoundService" />
答案 0 :(得分:2)
发生这种情况是因为该服务仍然在活动中受限制。要在多个活动绑定到服务时终止服务,您需要解除所有服务的绑定,如documentation所述:
服务生命周期 - 从创建时到生命周期 被破坏 - 可以遵循以下两种途径之一:
已启动的服务
当另一个组件调用startService()时,将创建该服务。 然后该服务无限期运行,必须通过调用自行停止 stopSelf()。另一个组件也可以通过调用来停止服务 stopService()。当服务停止时,系统会销毁它。
绑定服务
当另一个组件(客户端)调用时,将创建该服务 bindService()。然后,客户端通过该服务进行通信 一个IBinder界面。客户端可以通过调用关闭连接 unbindService()。多个客户端可以绑定到同一个服务 当所有这些解除绑定时,系统会破坏服务。服务 不需要自行停止。
这两条路径并非完全分开。您可以绑定到服务 已经从startService()开始。例如,你可以 通过调用startService()启动后台音乐服务 标识要播放的音乐的意图。后来,可能的时候了 用户希望对玩家进行一些控制或获取信息 关于当前歌曲,活动可以通过调用绑定到服务 bindService()。在这种情况下,stopService()或stopSelf() 在所有客户解除绑定之前,实际上并没有停止服务。
然后致电Context.stopService()
停止它:
context.stopService(new Intent(context, BackgroundSoundService.class));