Android MediaPlayer狀態及生命週期

狀態圖及生命週期:

 

1:Idle(就緒)狀態及End(結束)狀態

Idle:創建MP實例或者調用reset函數,處於Idle狀態;

此外,使用new操作符創建的MediaPlayer對象處於Idle狀態,而那些通過重載的create()便利方法創建的MediaPlayer對象卻不是處於Idle狀態。事實上,如果成功調用了重載的create()方法,那麼這些對象已經是Prepare狀態了。

End:調用release函數,就會變成End狀態。當處於End狀態時,它將不能再被使用,不能再回到其他狀態。

2.Error(錯誤)狀態

在構造一個新的MP實例或者調用reset函數,即在處於Idle狀態時,調用getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int), setLooping(boolean),setVolume(float, float), pause(), start(), stop(), seekTo(int), prepare() 或者 prepareAsync() 方法都是編程錯誤。

當一個MediaPlayer對象剛被構建的時候,內部的播放引擎和對象的狀態都沒有改變,在這個時候調用以上的那些方法,框架將無法回調客戶端程序註冊的OnErrorListener.onError()方法;

但若這個MediaPlayer對象調用了reset()方法之後,再調用以上的那些方法,內部的播放引擎就會回調客戶端程序註冊的OnErrorListener.onError()方法了,將會觸發MP到Error狀態,並將錯誤的狀態傳入。

所以一旦不再使用MediaPlayer,就需要調用release函數釋放資源。

3.Initialized(初始化)狀態

當調用setDataSourse()函數時,MP將會從Idle狀態變爲Initialized狀態;

如果在非Idle狀態調用setDataSourse,會拋出IllegalStateExecption異常。

當重載setDataSourse時需要拋出IllegalArgumentException(非法參數異常)和IOException兩個異常。

4.Prepared(準備)狀態

有兩種途徑到達Prepared狀態

(1)同步方式(使用本地音視頻文件):

調用parpare(同步函數)將從Initialized狀態變爲Prepared狀態。

(2)異步方式(使用網絡數據,需要緩衝數據):

調用prepareAsync(異步函數)將從Initialized狀態變爲Preparing狀態,最後到Prepared。

5.Started(開始)狀態

進入Prepared狀態後,上層應用可以設置一些屬性(音量等),必須調用start函數併成功返回,MP的狀態由Prepared變爲Started。

如果MediaPlayer已處於Started狀態,再調用start函數無效。

6.Pause(暫停)狀態

MP在播放控制時可以是Pause狀態和Stop狀態,且當前播放進度可以被調整。

調用MediaPlayer.pause函數,有Started變爲Pause,這個過程是瞬時的。

7.Stopped(停止)狀態

調用stop函數時,無論處於Started、Paused、Prepared或PlaybackCompleted哪種狀態,都會進入Stopped狀態。

一旦處於Stopped狀態,playback將不能開始,直到MP重新處於Prepared狀態。

8.PlaybackCompleted(播放完成)狀態

當前播放位置可通過getCurrentPosition函數獲取。

MP播放到數據流末尾,一次播放過程完成,如果事先調用setLooping(true),表示循環播放,MP依然處於Started狀態。

如果不循環播放,一次播放完成後MP進入PlaybackCompleted,此時調用start函數,將重啓播放器從頭開始播放數據。

 

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