You need to enable JavaScript to run this app. Android启动页MP4视频后台持续播放如何实现自动暂停与恢复?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 18:39:00