Intereting Posts
Как получить переменную окружения из локальной сети с помощью @Value весной? Аннотации Android с инструментами Kotlin и build 2.3.0 Почему небезопасный вызов .run () отлично работает при нулевом значении в Котлин? Связанные вызовы и наследование Спящий режим с Kotlin: @ManyToOne (fetch = FetchType.LAZY) POJO-объект для этого XML-ответа в котлине убедитесь, что метод kotlin является статическим, верхним или аннотированным @JvmStatic Генераторы Kotlin: использование интерфейса для MVP Воспроизведение аудиофайлов из требуемой папки Android Kotlin Task debug не найден в корневом проекте Добавление / Query / Parse SQLite с использованием Anko Kotlin от Java: поле nullable или нет? Как правильно делать PATCH в строго типизированных языках на основе Spring – пример Работа Gradle работает на локальной машине, но не работает на сервере Jenkins CI? Kotlin Android Studio / IntelliJ "Может быть объединено с назначением" Предупреждение об осмотре

Служба создает новый экземпляр медиаплеера

У меня проблема с сервисом.

В методе onCreate я создаю медиаплеер. Когда я перемещаюсь между действиями, я могу получить доступ к сервису плавно, и он поддерживает один и тот же экземпляр медиаплеера. Хотя, когда я оставляю приложение (аудио со службы mediaplayer все еще играет), а затем я возвращаюсь к приложению – я получаю новый экземпляр MediaPlayer. Звуковой поток из предыдущего экземпляра все еще воспроизводится.

Я хотел бы иметь доступ к тому же экземпляру MediaPlayer, что и для манипуляции воспроизводящей песней (например, пауза).

Знаете ли вы, что может быть проблемой?

class PlayerService : Service(), MediaPlayer.OnPreparedListener, PlayerServiceContract.ServiceContract { private val mBinder = PlayerBinder() private var mPlayer: MediaPlayer? = null private var mPresenter: PlayerServiceContract.Presenter? = null private var mRecording: Recording? = null override fun onCreate() { super.onCreate() mPlayer = MediaPlayer() mPlayer?.setWakeMode(applicationContext, PowerManager.PARTIAL_WAKE_LOCK) mPlayer?.setAudioStreamType(AudioManager.STREAM_MUSIC) mPlayer?.setOnPreparedListener(this) 

Связанная служба будет отключена, если служба будет отключена для всех своих привязок.
Служба, запущенная startService() будет отключена, если служба отключится, вызвав stopSelf() или stopService() .

Служба, которая вызывается startService() и bindService() будет уничтожена, если AND stopSelf () или stopService() .

Услуга может быть запущена и связана с ней. В таком случае система будет поддерживать работу службы до тех пор, пока она запущена или есть одно или несколько подключений к ней с помощью флага Context.BIND_AUTO_CREATE. Когда ни одна из этих ситуаций не выполняется, вызывается метод onDestroy () службы, и служба фактически прекращается. Вся очистка (остановка нитей, незарегистрированные приемники) должна быть завершена по возвращении из onDestroy ().
– От Service.Service Lifecycle | Разработчик Android Doc

В вашем случае, когда действия исчезли, служба, кажется, входит в состояние несвязанного состояния и может быть уничтожена.
Возможно, вам нужно вызвать startService() в той же службе при запуске игры и вызвать stopSelf() когда вы остановите игру, чтобы служба не могла быть уничтожена во время воспроизведения медиа.

ПРИМЕЧАНИЕ. Некоторые говорят, что вы должны вызвать stopSelf() после вскрытия всех. Некоторые говорят, что порядок остановки и развязывания не имеет значения. Я не знаю, что правильно.