Android MediaPlayer的生命週期

LiuYinChina發表於2013-09-27

Android MediaPlayer的生命週期

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

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

 

Idle 狀態: 

  進入idle狀態的方式有以下兩種:

   1) 使用 new() 方法建立一個 MediaPlayer 物件;

        2) 呼叫了其 reset() 方法;

  這兩種方法的一個重要差別就是:如果在這個狀態下呼叫了 getDuration() 等方法(相當於呼叫時機不正確),引發的後果不同,如下

   1)通過 reset() 方法進入 idle 狀態的話會觸發 OnErrorListener.onError() ,並且 MediaPlayer 會進入 Error 狀態;

   2)如果是新建立的 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 狀態。

相關文章