服务正在创建媒体播放器的新实例

时间:2017-05-19 11:56:07

标签: android service android-mediaplayer kotlin

我的服务有问题。

在onCreate的方法中我创建了媒体播放器。 当我在活动之间移动时,我能够顺利地访问服务,并且它保持相同的媒体播放器实例。虽然,当我离开应用程序(来自服务媒体播放器的音频仍在播放)然后我返回应用程序 - 我得到新的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)

1 个答案:

答案 0 :(得分:1)

如果服务的所有绑定都未绑定,则将关闭绑定服务 如果通过致电startService()stopSelf()关闭服务,将关闭由stopService()启动的服务。

如果AND stopSelf()或startService(),则bindService()stopService()调用的服务将被销毁。

  

服务既可以启动,也可以绑定连接。在   在这种情况下,系统只要保持服务运行   要么启动,要么有一个或多个连接   Context.BIND_AUTO_CREATE标志。曾经两种情况都没有   hold,调用服务的onDestroy()方法,服务就是   有效终止。所有清理(停止线程,取消注册   接收器)应该从onDestroy()返回时完成    - 来自Service.Service Lifecycle | Android Developers Doc

在您的情况下,当活动消失时,服务似乎进入未绑定状态并可能被销毁 也许您在开始播放时必须在同一服务中呼叫startService(),并在停止播放时呼叫stopSelf(),以便在播放媒体时无法销毁该服务。

注意:有些人说你必须在解除所有绑定后调用stopSelf()。有人说停止和解除绑定的顺序无关紧要。我不知道哪个是正确的。