我正在尝试使用后台服务播放音乐。首先,我在toggle button
中有MainActivity
用于播放和暂停音乐。我也创造了
BackgroundSoundService
只是为了在所有活动中播放音乐而不是在后台播放:
public class BackgroundSoundService extends Service {
private static final String TAG = "BackgroundSoundService";
MediaPlayer player;
public IBinder onBind(Intent arg0) {
Log.i(TAG, "onBind()" );
return null;
}
@Override
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.vaporv2);
player.setLooping(true); // Set looping
player.setVolume(100,100);
Log.i(TAG, "onCreate() , service started...");
}
public int onStartCommand(Intent intent, int flags, int startId) {
player.start();
return Service.START_STICKY;
}
public IBinder onUnBind(Intent arg0) {
Log.i(TAG, "onUnBind()");
return null;
}
public void onStop() {
Log.i(TAG, "onStop()");
}
public void onPause() {
if(player!=null && player.isPlaying()){
player.pause();
}
Log.i(TAG, "onPause()");
}
@Override
public void onDestroy() {
player.stop();
player.release();
Log.i(TAG, "onCreate() , service stopped...");
}
@Override
public void onLowMemory() {
Log.i(TAG, "onLowMemory()");
}
}
和MainActivity
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MusicButton = (ToggleButton) findViewById(R.id.toggleButton);
MusicButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (MusicButton.isChecked()) {
//mediaPlayer.pause();
Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
startService(myService);
} else {
//mediaPlayer.start();
Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
stopService(myService);
}
}
});
当我暂停音乐并再次播放时,我的问题就出现了。音乐从一开始就开始,我希望它从它停止的地方继续。我的第二个问题是我不想在后台播放音乐,我想在应用程序处于后台时停止播放音乐。
答案 0 :(得分:3)
我不确定你的onPause()
和onStop()
是做什么的。但是,当您首次使用Context.startService()
启动服务时,会调用该服务的onCreate()
方法,然后调用onStartCommand()
,稍后当您再次呼叫startService()
时调用onStartCommand()
。因此,无论出于何种原因,如果您想在服务中播放声音并在同一服务中暂停,您需要提供一个Action
来指定您要执行的操作。
所以在您的活动中,当您想告诉服务播放声音时:
String action = "PLAY";
Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
myService.setAction(action);
startService(myService);
并暂停声音:
String action = "PAUSE";
Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
myService.setAction(action);
startService(myService);
以及您服务中的onStartCommand()
方法:
if (intent.getAction().equals("PLAY")) {
// resume the sound
}
if (intent.getAction().equals("PAUSE")) {
// pause the sound
}
当你真的需要停止服务意味着Destroy
服务时,请调用context.stopService()
,然后只调用onDestroy()
方法并且服务真的被破坏。
答案 1 :(得分:0)
要防止在活动暂停时在后台覆盖中播放,请暂停您在那里的服务并恢复您离开的位置,在首选项中保存当前位置,然后在需要时检索