一、MediaPlayer的狀態
空閒、初始化、正在準備、已經準備、開始、暫停、停止、播放完成、出錯、結束。
二、空閒狀態
1、在創建對象或者調用對象的reset()方法進入該狀態。
2、在該狀態下,給對象設置了出錯監聽,調用對象的以下方法將會回調監聽裏面的onError()方法:getCurrentPosition()
,getDuration()
,getVideoHeight()
,getVideoWidth()
,setAudioStreamType(int)
,setLooping(boolean)
,setVolume(float,
float)
,pause()
,start()
,stop()
,seekTo(int)
,prepare()
orprepareAsync()
;如果對象沒有調用reset方法,則狀態不發生變化,如果對象調用了reset()方法,則狀態回進入出錯狀態。
三、初始化狀態
當對象在空閒狀態下,調用了對象的setDataSource()方法進入該狀態。
四、正在準備狀態
1、 當對象在初始化狀態下,調用了對象的prepareAsync()方法進入該狀態;
2、當對象在停止狀態下,調用了對象的prepareAsync()方法進入該狀態。
五、已經準備狀態
1、當對象在初始化狀態下,調用了對象的prepare()方法進入該狀態;
2、對象可以在正在準備狀態下,調用對象的onPreparedListener()方法,給該對象設置一個準備監聽,當準備完成之後,系統會會調用該監聽的onPrepared()方法,從而進入該狀態;
3、當對象已經在該狀態下,調用了對象的seekTo()方法,狀態沒有發生改變;
4、當對象在停止狀態下,調用了prepare()方法也會進入該狀態。
5、使用靜態方法create()創建對象時,創建出來的對象就在該狀態。
六、開始狀態
1、 當對象在已經準備的狀態下,調用了對象的start()方法進入該狀態;
2、對象已經在該狀態下,調用seekTo()方法,或者再次調用了start()方法,狀態沒有發生改變。
3、當對象已經在該狀態下,播放完成之後且Looping設置爲true時,狀態沒有發生改變。
4、當對象在暫停狀態下,調用了start()方法進入該狀態。
5、當對象在已經播放完成狀態下,調用了start()方法進入該狀態,音樂從頭播放。
6、如果對象已經在開始狀態下,多次調用start()方法是沒有影響的。
七、暫停狀態
1、當對象在開始狀態下,調用了pause()方法進入該狀態;
2、當對象已經在該狀態下,調用了seekTo()方法或者再次調用了pause()方法,狀態沒有發生改變。
3、當對象已經在暫停狀態下,多次調用pause()方法沒有影響。
八、停止狀態
1、當對象在開始狀態下,調用了stop()方法進入該狀態;
2、當對象在暫停狀態下,調用了stop()方法進入該狀態;
3、當對象在準備完成狀態下,調用了stop()方法進入該狀態。
4、當對象在播放完成狀態下,調用了stop()方法進入該狀態。
5、當對象在停止狀態下,是不能再開始播放了,除非再次調用prepare()或者prepareAsync()方法進入準備狀態。
6、當對象在停止狀態下,多次調用stop()方法是沒有影響的。
九、播放完成狀態
1、當對象在開始狀態下,一直將音樂播放完成且是否循環播放設置爲false進入該狀態。
2、已經在該狀態下,用戶調用了對象的seekTo()方法,狀態未發生改變,只是在調用了start()方法後,是從seekTo()設置的位置開始播放。
十、出錯狀態
1、 給對象設置出錯監聽onErrorListener(),當回調onError()方法時,進入出錯狀態。
2、即使沒有設置onErrorListener(),當錯誤發生時,也會進入出錯狀態。
3、爲了能從出錯狀態恢復,可以調用對象的reset()方法,讓該對象進入空閒狀態。
4、當對象在沒有在初始化狀態,停止狀態,正在準備狀態,或者已經準備狀態下,調用了prepare()或者prepareAsync()方法,程序會拋出IllegalStateException異常。
5、如果不是在空閒狀態下調用了setDataSource()方法,則程序會拋出IllegalStateException異常。
十一、結束狀態
當對象調用了release()方法,進入結束狀態。
十二、官網上狀態轉化圖