2017-05-19 28 views
0

我遇到服務問題。服務正在創建mediaplayer的新實例

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

檢查服務的onDestroy()是否被調用。 – Naetmul

+1

如果您在活動結束後取消綁定服務,則在離開應用程序時該服務可能會被銷燬。首先檢查一下。 – Naetmul

+0

您的代碼不完整,請將您的完整課程或至少完整的功能代碼放在此處。 – chandil03

回答

1

如果服務獲取所有綁定的綁定,綁定服務將被關閉。
如果通過撥打stopSelf()stopService()關閉服務,則由startService()啓動的服務將被關閉。

如果AND stopSelf()或stopService()將同時銷燬由startService()bindService()調用的服務。

服務既可以啓動,也可以綁定連接。在 這樣的情況下,系統將保持該服務運行,只要 或者它啓動或者有一個或多個連接到它的Context.BIND_AUTO_CREATE標誌。一旦這兩種情況都不成立,就會調用服務的onDestroy()方法,並且服務有效終止 。從onDestroy()返回後,所有清理(停止線程,取消註冊接收器)應該完成。
- 從Service.Service Lifecycle | Android Developers Doc

在你的情況下,當活動都走了,該服務似乎進入結合狀態,並可能被破壞。
也許您在開始播放時必須在相同的服務中撥打startService(),並在停止播放時撥打stopSelf(),以便在播放媒體時不會損壞服務。

注意:有人說你必須在全部解除綁定後再調用stopSelf()。有人說停止和解除綁定的順序是不相關的。我不知道哪一個是正確的。

+0

謝謝,我其實並沒有通過startService啓動服務,而是bindService,這是問題的根源。 – Orbite