Ротация активности приводит к остановке службы
У меня есть сервис, который воспроизводит музыку, и действие, которое предоставляет графический интерфейс для взаимодействия с сервисом. Действие открывается при щелчке элемента списка (у меня есть список записей) и связывает сервис (и создает его) с помощью метода onCreate().,
Когда вызывается onDestroy(), я отменяю привязку службы (это уничтожит службу) - это должно быть нормально, так как я не хочу, чтобы служба запускалась при завершении действия, но проблема возникает при изменении ориентации, потому что она воссоздает снова активность и сервис (и дорожка останавливается и снова воспроизводится с самого начала при вращении устройства).
Я знаю о некоторых флагах (Ориентация изменения), которые могут быть полезны, но это не очень хорошая практика для меня, так как я хочу другой макет на ландшафте. Также я мог бы сделать так, чтобы служба музыкального проигрывателя работала до тех пор, пока работает мое приложение, но это не очень хорошая идея, поскольку пользователь может не захотеть открывать проигрыватель, а просто записывать, поэтому служба проигрывателя здесь не обязательно,
Вот некоторые фрагменты кода:
@Override
protected void onCreate(Bundle savedInstanceState) {
LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver, new IntentFilter(PlayerBroadcastReceiver.ACTION_PLAYER_SERVICE_STARTED));
setContentView(R.layout.media_player_screen);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
AudioPlayerServiceBridge.getInstance().addCallback(this);
AudioPlayerServiceBridge.getInstance().doBindService(this);
init(savedInstanceState);
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalReceiver);
mLocalReceiver.removeCallback();
Log.d(AudioPlayerActivity.class.getName(), "onDestroy() -> "+AudioPlayerActivity.class.getName());
AudioPlayerServiceBridge.getInstance().doUnbindService(this);
AudioPlayerServiceBridge.getInstance().removeCallback(this);
super.onDestroy();
}
и диспетчер соединений со службами:
public void doBindService(Context context) {
// Establish a connection with the service. We use an explicit
// class name because there is no reason to be able to let other
// applications replace our component.
if(!mIsBound){
context.bindService(new Intent(context,
AudioPlayerService.class), serviceConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
}
public void doUnbindService(Context context) {
if (mIsBound) {
// If we have received the service, and hence registered with
// it, then now is the time to unregister.
if (mServiceMessenger != null) {
Message msg = Message.obtain(null, AudioPlayerService.MSG_UNREGISTER_CLIENT);
msg.replyTo = mMessenger;
mServiceMessenger.send(msg);
}
// Detach our existing connection.
context.unbindService(serviceConnection);
mIsBound = false;
}
}
Пожалуйста, покажите мне, если возможно, хорошую практику для решения этой проблемы.
1 ответ
Ответ:
Мне следует запустить службу с помощью: startService(new Intent(this, service.class)) и START BINDING после этого. Этот метод предотвращает уничтожение службы при вызове doUnbind(). Таким образом, метод onCreate() теперь изменяется в:
@Override
protected void onCreate(Bundle savedInstanceState) {
LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver, new IntentFilter(PlayerBroadcastReceiver.ACTION_PLAYER_SERVICE_STARTED));
setContentView(R.layout.media_player_screen);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
if(savedInstanceState == null)
startService(new Intent(this, AudioPlayerService.class));
AudioPlayerServiceBridge.getInstance().addCallback(this);
AudioPlayerServiceBridge.getInstance().doBindService(this);
init(savedInstanceState);
super.onCreate(savedInstanceState);
}
Метод onDestroy():
@Override
protected void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalReceiver);
mLocalReceiver.removeCallback();
Log.d(AudioPlayerActivity.class.getName(), "onDestroy() -> "+AudioPlayerActivity.class.getName());
AudioPlayerServiceBridge.getInstance().doUnbindService(this);
AudioPlayerServiceBridge.getInstance().removeCallback(this);
super.onDestroy();
}
и остановите службу (если хотите) в onBackPressed():
@Override
public void onBackPressed() {
Log.d(AudioPlayerActivity.class.getName(), "onBackPressed() -> "+AudioPlayerActivity.class.getName());
isPaused = true;
Log.d(AudioPlayerActivity.class.getName(), "Sending message to player service: MSG_RELEASE_PLAYER");
AudioPlayerServiceBridge.getInstance().sendAsyncCall(AudioPlayerService.MSG_RELEASE_PLAYER);
if(mSeekBarChanger != null){
mSeekBarChanger.stopThread();
}
AudioPlayerServiceBridge.getInstance().doUnbindService(this);
stopService(new Intent(this, AudioPlayerService.class));
super.onBackPressed();
}