Android MediaPlayer的生命週期

MediaPlayer 的狀態轉換圖也表徵了它的生命週期,搞清楚這個圖可以幫助我們在使用 MediaPlayer 時考慮情況更周全,寫出的代碼也更具健壯性。


這張狀態轉換圖清晰的描述了 MediaPlayer 的各個狀態,也列舉了主要的方法的調用時序,每種方法只能在一些特定的狀態下使用,如果使用時 MediaPlayer 的狀態不正確則會引發 IllegalStateException 異常 。

 

Idle 狀態: 當使用 new() 方法創建一個 MediaPlayer 對象或者調用了其 reset() 方法時,該 MediaPlayer 對象處於 idle狀態。這兩種方法的一個重要差別就是:如果在這個狀態下調用了 getDuration() 等方法(相當於調用時機不正確),通過reset() 方法進入 idle 狀態的話會觸發 OnErrorListener.onError() ,並且 MediaPlayer 會進入 Error 狀態;如果是新創建的MediaPlayer 對象,則並不會觸發 onError(), 也不會進入 Error 狀態。

 

End 狀態: 通過 release() 方法可以進入 End 狀態,只要 MediaPlayer 對象不再被使用,就應當儘快將其通過 release()方法釋放掉,以釋放相關的軟硬件組件資源,這其中有些資源是隻有一份的(相當於臨界資源)。如果 MediaPlayer 對象進入了 End 狀態,則不會在進入任何其他狀態了。

 

Initialized 狀態: 這個狀態比較簡單, MediaPlayer 調用 setDataSource() 方法就進入 Initialized 狀態,表示此時要播放的文件已經設置好了。

 

Prepared 狀態: 初始化完成之後還需要通過調用 prepare() 或 prepareAsync() 方法,這兩個方法一個是同步的一個是異步的,只有進入 Prepared 狀態,才表明 MediaPlayer 到目前爲止都沒有錯誤,可以進行文件播放。

 

Preparing 狀態: 這個狀態比較好理解,主要是和 prepareAsync() 配合,如果異步準備完成,會觸發OnPreparedListener.onPrepared() ,進而進入 Prepared 狀態。

 

Started 狀態: 顯然, MediaPlayer 一旦準備好,就可以調用 start() 方法,這樣 MediaPlayer 就處於 Started 狀態,這表明 MediaPlayer 正在播放文件過程中。可以使用 isPlaying() 測試 MediaPlayer 是否處於了 Started 狀態。 如果播放完畢,而又設置了循環播放,則 MediaPlayer 仍然會處於 Started 狀態,類似的,如果在該狀態下 MediaPlayer 調用了seekTo() 或者 start() 方法均可以讓 MediaPlayer 停留在 Started 狀態。

 

Paused 狀態: Started 狀態下 MediaPlayer 調用 pause() 方法可以暫停 MediaPlayer ,從而進入 Paused 狀態,MediaPlayer 暫停後再次調用 start() 則可以繼續 MediaPlayer 的播放,轉到 Started 狀態,暫停狀態時可以調用 seekTo() 方法,這是不會改變狀態的。

 

Stop 狀態: Started 或者 Paused 狀態下均可調用 stop() 停止 MediaPlayer ,而處於 Stop 狀態的 MediaPlayer 要想重新播放,需要通過 prepareAsync() 和 prepare() 回到先前的 Prepared 狀態重新開始纔可以。

 

PlaybackCompleted 狀態: 文件正常播放完畢,而又沒有設置循環播放的話就進入該狀態,並會觸發OnCompletionListener 的 onCompletion() 方法。此時可以調用 start() 方法重新從頭播放文件,也可以 stop() 停止MediaPlayer ,或者也可以 seekTo() 來重新定位播放位置。

 

Error 狀態: 如果由於某種原因 MediaPlayer 出現了錯誤,會觸發 OnErrorListener.onError() 事件,此時 MediaPlayer即進入 Error 狀態,及時捕捉並妥善處理這些錯誤是很重要的,可以幫助我們及時釋放相關的軟硬件資源,也可以改善用戶體驗。通過 setOnErrorListener(android.media.MediaPlayer.OnErrorListener) 可以設置該監聽器。如果 MediaPlayer 進入了Error 狀態,可以通過調用 reset() 來恢復,使得 MediaPlayer 重新返回到 Idle 狀態。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章