首页 文章

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

提问于
浏览
0

我的服务有问题 .

在方法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 回答

  • 1

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

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

    服务既可以启动也可以绑定连接 . 在这种情况下,只要系统启动或者使用Context.BIND_AUTO_CREATE标志有一个或多个连接,系统就会保持服务运行 . 一旦这些情况都不成立,就会调用服务的onDestroy()方法并有效终止服务 . 从onDestroy()返回时,应完成所有清理(停止线程,取消注册接收器) . - 来自Service.Service生命周期| Android开发者文档

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

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

相关问题