管理 MediaPlayer 狀態和資源

本文將說明兩個可能出現問題的領域。

  • State。使用「Medialayer」時,某些作業僅適用於特定狀態。操作不當可能會導致例外狀況或非預期的行為。

  • 資源:進行設定變更 (例如旋轉螢幕) 時,您必須釋放 MediaPlayer 物件,才能釋出系統資源並避免資源耗盡。

管理狀態

MediaPlayer 是以狀態為基礎,也就是說,當您編寫程式碼時,必須隨時注意其內部狀態,因為只有在播放器處於特定狀態時,某些作業才有效。如果在錯誤狀態下執行作業,系統可能會擲回例外狀況,或導致其他不良行為。

MediaPlayer 類別文件中的狀態圖會說明哪些方法可將 MediaPlayer 從一個狀態移至另一個狀態。例如:

如圖所示,此時您可以呼叫 start()pause()seekTo() 等方法,在 StartedPausedPlaybackCompleted 狀態之間移動。

不過,當您呼叫 stop() 時,請注意,您必須先準備 MediaPlayer,才能再次呼叫 start()

編寫與 MediaPlayer 物件互動的程式碼時,請務必留意狀態圖,因為從錯誤狀態呼叫方法是常見的錯誤原因。

釋放 MediaPlayer

MediaPlayer 可能會耗用寶貴的系統資源。因此,您應一律採取額外預防措施,確保不會保留 MediaPlayer 執行個體超過必要時間。完成後,請務必呼叫 release(),確保分配給該項目的系統資源已正確釋出。

舉例來說,如果您使用 MediaPlayer,且活動收到 onStop() 的呼叫,您必須釋放 MediaPlayer,因為在活動未與使用者互動時保留該物件沒有意義 (除非您在背景播放媒體,這會在下一節中討論)。

當然,當活動恢復或重新啟動時,您需要建立新的 MediaPlayer 並再次準備,才能繼續播放。

以下說明如何發布並隨後將 MediaPlayer 設為空值:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

舉例來說,假設您忘記在活動停止時釋放 MediaPlayer,但在活動再次啟動時建立新的 MediaPlayer,會發生什麼問題?當使用者變更螢幕方向 (或以其他方式變更裝置設定) 時,系統預設會重新啟動活動。使用者在直向和橫向之間來回旋轉裝置時,您可能會快速耗用所有系統資源,因為每次螢幕方向變更時,您都會建立新的 MediaPlayer,但從未釋出。

如要進一步瞭解執行階段重新啟動,請參閱「處理執行階段變更」。

您可能會想知道,如果使用者離開活動,但您仍想繼續播放「背景媒體」,該怎麼做?這與內建的「音樂」應用程式行為非常相似。在這種情況下,您需要的是由 Service 控制的 MediaPlayer,詳情請見下一節。

瞭解詳情

建議您使用 Jetpack Media3 在應用程式中播放媒體。瞭解詳情

這些頁面涵蓋音訊和影片的錄製、儲存及播放相關主題: