狀態圖及生命週期:
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函數,將重啓播放器從頭開始播放數據。