Android启动页MP4视频后台持续播放如何实现自动暂停与恢复?
问题原因
该故障由Activity生命周期和VideoView的渲染逻辑共同导致:
- 应用退至后台时,Activity触发
onPause生命周期,但未主动暂停视频,MediaPlayer会在后台持续解码播放 - 退后台后VideoView的渲染Surface被系统回收,重新回到前台时Surface重建,但未与正在运行的MediaPlayer绑定,因此出现黑屏仅出声音的问题
修复后完整代码
import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.view.WindowManager; import android.widget.VideoView; public class MainActivity extends AppCompatActivity { VideoView videoView; // 存储退后台时的视频播放进度 private int mCurrentPlayPosition = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags((WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); videoView = findViewById(R.id.videoView); Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video); videoView.setVideoURI(video); videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { if (isFinishing()) return; startActivity(new Intent(MainActivity.this, MainActivity2.class)); finish(); } }); // 启动视频播放 videoView.start(); } @Override protected void onPause() { super.onPause(); // 退后台时暂停播放,记录当前进度 if (videoView.isPlaying()) { videoView.pause(); mCurrentPlayPosition = videoView.getCurrentPosition(); } } @Override protected void onResume() { super.onResume(); // 回到前台时恢复播放 if (mCurrentPlayPosition > 0) { videoView.seekTo(mCurrentPlayPosition); videoView.start(); mCurrentPlayPosition = 0; } } @Override protected void onDestroy() { super.onDestroy(); // 销毁页面时释放资源,避免内存泄漏 if (videoView != null) { videoView.stopPlayback(); videoView = null; } } }
核心修改说明
- 新增
mCurrentPlayPosition成员变量,用于存储退后台时的视频播放进度 - 重写
onPause生命周期:退后台时主动暂停视频,记录当前播放位置 - 重写
onResume生命周期:回到前台时将视频定位到之前记录的位置,继续播放 - 重写
onDestroy生命周期:页面销毁时释放VideoView占用的资源,避免内存泄漏 - 补充
videoView.start()调用,确保首次启动时视频正常播放
内容的提问来源于stack exchange,提问作者Serena Swift
相关产品推荐
相关产品推荐

