【问题标题】:Service is creating new instance of mediaplayer服务正在创建媒体播放器的新实例
【发布时间】:2017-10-19 13:14:13
【问题描述】:

我的服务有问题。

在 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)

【问题讨论】:

  • 检查服务的onDestroy()是否被调用。
  • 如果在activity消失的时候解绑服务,那么在你离开应用的时候服务可以被销毁。首先检查一下。
  • 你的代码不完整,把你完整的类或者至少完整的函数代码放在这里。
  • 你找到解决办法了吗?

标签: android service android-mediaplayer kotlin


【解决方案1】:

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

同时被startService()bindService() 调用的服务将在 AND stopSelf() 或stopService() 中被销毁。

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

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

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

【讨论】:

  • 谢谢,其实我不是用startService启动服务而是用bindService启动的,这才是问题的根源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多