首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 音樂播放器返回鍵崩潰:MediaPlayer 釋放順序與 Activity 生命週期衝突

     編輯:程式設計綜合問答

崩潰現象

按下返回鍵時,App 崩潰,日誌顯示 MediaPlayer 仍在播放狀態下被釋放或重複操作。

根本原因

  • onKeyDown 中直接呼叫 mediaPlayer.stop(); mediaPlayer.release(); 後,又啟動新 Intent 跳轉,導致原 Activity 銷毀時 MediaPlayer 狀態不一致。
  • 背景執行緒 runable 仍在輪詢 mediaPlayer.getCurrentPosition(),存取已釋放的物件。
  • 未在 onPause/onStop/onDestroy 中統一釋放資源,依賴鍵盤事件處理易漏、易錯。

修正原則

  1. 資源釋放集中在生命週期回調:
    onPause() 暫停播放,onStop() 或 onDestroy() 執行 release()。
  2. 背景執行緒檢查狀態:輪詢迴圈前加 if (mediaPlayer == null) break;。
  3. 返回鍵僅觸發 finish():
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            finish(); // 讓 Activity 正常走生命週期
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
  4. 移除手動啟動新 Intent:返回上一頁應由系統回棧處理,除非有特殊業務需求。

完善的生命週期範本

@Override
protected void onPause() {
    super.onPause();
    if (mediaPlayer != null && mediaPlayer.isPlaying())
        mediaPlayer.pause();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mediaPlayer != null) {
        mediaPlayer.release();
        mediaPlayer = null;
    }
    // 停止背景執行緒
    handler.removeCallbacksAndMessages(null);
}

總結

遵循 Activity 生命週期管理 MediaPlayer,移除手動釋放與跳轉邏輯,背景執行緒加空值檢查,即可消除返回鍵崩潰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved