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

Android VideoView 鎖屏後自動停止播放的完整解決方案

     編輯:程式設計疑難解答

問題背景

在 Android 應用開發中,使用 VideoView 播放視頻時,常遇到一個體驗問題:當用戶鎖屏或關閉屏幕後,視頻仍在後台繼續播放,不僅消耗電量,還可能造成流量浪費。這篇文章將詳細介紹如何監聽屏幕狀態變化,實現鎖屏自動暫停、亮屏恢復播放的功能。

核心解決思路

Android 系統提供了屏幕狀態變化的廣播意圖:Intent.ACTION_SCREEN_ON 和 Intent.ACTION_SCREEN_OFF。我們可以在 Activity 中註冊一個 BroadcastReceiver 來監聽這兩個廣播,從而控制 VideoView 的播放狀態。

實現步驟

1. 定義廣播接收器

private BroadcastReceiver screenReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_SCREEN_OFF.equals(action)) {
            // 鎖屏/息屏時暫停播放
            if (videoView != null && videoView.isPlaying()) {
                videoView.pause();
                isPausedByLock = true; // 標記是否由鎖屏引起暫停
            }
        } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
            // 亮屏時恢復播放
            if (videoView != null && isPausedByLock) {
                videoView.start();
                isPausedByLock = false;
            }
        }
    }
};

2. 在 Activity 生命周期中註冊/註銷

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    registerReceiver(screenReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(screenReceiver);
}

注意事項

  • 權限聲明:這兩個廣播屬於系統保護廣播,不能在 AndroidManifest.xml 中靜態註冊,必須在代碼中動態註冊(如上所示)。
  • 狀態保存:建議配合 onSaveInstanceState 保存播放進度,防止 Activity 被系統回收後無法恢復。
  • 多窗口模式:Android 7.0+ 支持分屏模式,鎖屏廣播行為可能不同,建議實機測試。

進階優化:結合 MediaSession

為了更好地處理音頻焦點、耳機拔出、媒體按鈕等場景,建議將 VideoView 封裝在 MediaSessionCompat 中,並配合 MediaControllerCompat 實現標準媒體播放控制流程。

總結

通過監聽 ACTION_SCREEN_ON/OFF 廣播,我們可以輕鬆實現視頻播放器的智能暫停/恢復邏輯,顯著提升用戶體驗並節省設備資源。這是 Android 視頻類應用開發中的基礎且重要的一環。

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