當MediaPlayer對象剛剛使用new創建或在reset()被調用後,它處於空閒狀態;並且在release()被調用之後,它處於結束狀態。在這兩個狀態之間是MediaPlayer對象的生命週期。
在調用reset()之後,新構建的MediaPlayer對象與MediaPlayer對象之間有一個微妙但重要的區別。調用getCurrentPosition(),getDuration(),getVideoHeight(),getVideoWidth(),setAudioStreamType(int),setLooping(boolean),setVolume(float,float),pause(),start() ,stop(),seekTo(int),prepare()或prepareAsync()在空閒狀態爲兩種情況。如果在構建MediaPlayer對象之後立即調用這些方法中的任何一種,則用戶提供的回調方法OnErrorListener.onError()不會被內部播放器引擎調用,並且對象狀態保持不變;但是如果這些方法在reset()之後調用,則用戶提供的回調方法OnErrorListener.onError()將被內部播放器引擎調用,並且對象將被轉移到Error狀態。
還建議一旦MediaPlayer對象不再被使用,請立即調用release(),以便可以立即釋放與MediaPlayer對象關聯的內部播放器引擎使用的資源。資源可能包括單例資源,例如硬件加速組件和調用釋放失敗()可能導致MediaPlayer對象的後續實例落後於軟件實現或完全失敗。 MediaPlayer對象處於“結束”狀態後,將無法再使用,無法將其恢復到任何其他狀態。
此外,使用new創建的MediaPlayer對象處於空閒狀態,而使用重載的方便創建方法之一創建的對象不處於空閒狀態。實際上,如果使用create方法創建成功,則對象處於Prepared狀態。
重要的是要注意,一旦發生錯誤,MediaPlayer對象就會進入錯誤狀態(除了上述內容),即使應用程序尚未註冊錯誤偵聽器。
爲了重新使用處於Error狀態並從錯誤中恢復的MediaPlayer對象,可以調用reset()來將對象恢復到其空閒狀態。
這是一個很好的編程實踐,讓你的應用程序註冊一個OnErrorListener來尋找內部播放器引擎的錯誤通知。
拋出IlleglStateException以防止編程錯誤,例如調用prepare(),prepareAsync()或其中一個重載的setDataSource方法處於無效狀態。
調用setDataSource(FileDescriptor)或setDataSource(String)或setDataSource(Context,Uri)或setDataSource(FileDescriptor,long,long)將處於空閒狀態的MediaPlayer對象傳送到Initialized狀態。
如果在任何其他狀態下調用setDataSource(),都會拋出IllegalStateException異常。
總是注意可能從重載的setDataSource方法拋出的IllegalArgumentException和IOException是一個很好的編程實踐。