在 Android 應用開發中,使用 VideoView 播放視頻時,常遇到一個體驗問題:當用戶鎖屏或關閉屏幕後,視頻仍在後台繼續播放,不僅消耗電量,還可能造成流量浪費。這篇文章將詳細介紹如何監聽屏幕狀態變化,實現鎖屏自動暫停、亮屏恢復播放的功能。
Android 系統提供了屏幕狀態變化的廣播意圖:Intent.ACTION_SCREEN_ON 和 Intent.ACTION_SCREEN_OFF。我們可以在 Activity 中註冊一個 BroadcastReceiver 來監聽這兩個廣播,從而控制 VideoView 的播放狀態。
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;
}
}
}
};
@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);
}
onSaveInstanceState 保存播放進度,防止 Activity 被系統回收後無法恢復。為了更好地處理音頻焦點、耳機拔出、媒體按鈕等場景,建議將 VideoView 封裝在 MediaSessionCompat 中,並配合 MediaControllerCompat 實現標準媒體播放控制流程。
通過監聽 ACTION_SCREEN_ON/OFF 廣播,我們可以輕鬆實現視頻播放器的智能暫停/恢復邏輯,顯著提升用戶體驗並節省設備資源。這是 Android 視頻類應用開發中的基礎且重要的一環。