Android MediaPlayer的生命週期
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 狀態。
相關文章
- [Android]Activity的生命週期Android
- android:碎片的生命週期Android
- Android Activity生命週期Android
- Android之各生命週期Android
- Android Activit生命週期方法Android
- Android View的生命週期詳解AndroidView
- View生命週期與Activity生命週期的關係View
- Android Service生命週期淺析Android
- Android Fragment生命週期深入探究AndroidFragment
- Android 元件系列-----Activity生命週期Android元件
- Android Activity生命週期詳解Android
- Android程式生命週期ProcessLifecycleAndroid
- 生命週期
- Android Activity生命週期的一點感悟Android
- Android:聊聊 MVP 中 Presenter 的生命週期AndroidMVP
- 初識Android之Activity的生命週期Android
- Android Fragment的生命週期和返回棧AndroidFragment
- Flutter 的生命週期Flutter
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- vue的生命週期Vue
- Fragment的生命週期Fragment
- App的生命週期APP
- View的生命週期View
- Servlet的生命週期Servlet
- bean的生命週期Bean
- Android 監聽生命週期工具庫Android
- Flutter仿Android生命週期LifecycleStateFlutterAndroid
- Android全面解析之Activity生命週期Android
- Android中元件生命週期完全解析Android元件
- Android 程式生命週期 Process LifecycleAndroid
- 擼擼Android的羊毛(二)----Activity生命週期Android
- Android 之 Activity 生命週期的淺析(二)Android
- Android中bindService的使用及Service生命週期Android
- Android中startService的使用及Service生命週期Android
- PHP 生命週期PHP
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session