You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView网页视频后台播放:按Home键不暂停的实现

解决WebView按下Home键视频暂停的问题

我之前做类似需求时踩过不少坑,终于摸索出稳定的解决方案,帮你搞定这个问题:

核心原因分析

当按下Home键时,Activity会进入onPause状态,WebView默认会调用自身的onPause()方法,这个方法会自动暂停页面内所有媒体播放。我们要做的就是打破这个默认逻辑,同时确保后台播放的稳定性。


步骤1:自定义WebView,阻止默认暂停行为

创建一个自定义WebView,覆盖它的onPause()方法,避免触发媒体暂停:

public class BackgroundPlayWebView extends WebView {
    public BackgroundPlayWebView(Context context) {
        super(context);
        initWebSettings();
    }

    public BackgroundPlayWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initWebSettings();
    }

    public BackgroundPlayWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initWebSettings();
    }

    private void initWebSettings() {
        WebSettings settings = getSettings();
        settings.setJavaScriptEnabled(true);
        // 允许无需用户手势自动播放(如果你的视频需要自动启动的话)
        settings.setMediaPlaybackRequiresUserGesture(false);
        settings.setDomStorageEnabled(true); // 部分视频网站依赖DOM存储
        settings.setLoadWithOverviewMode(true);
        settings.setUseWideViewPort(true);
    }

    @Override
    public void onPause() {
        // 不调用super.onPause(),彻底阻止WebView暂停媒体
    }

    @Override
    public void onResume() {
        super.onResume(); // 恢复WebView的正常交互逻辑
    }
}

步骤2:修改Activity生命周期,确保后台播放稳定性

在你的MainActivity中使用自定义WebView,并处理音频焦点、前台服务等关键逻辑:

public class MainActivity extends Activity {
    private BackgroundPlayWebView mWebView;
    private AudioManager audioManager;
    private AudioFocusRequest audioFocusRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化自定义WebView(确保布局中使用的是BackgroundPlayWebView)
        mWebView = findViewById(R.id.webview);
        mWebView.loadUrl("你的视频网页地址");

        // 初始化音频焦点,防止后台播放被系统打断
        initAudioFocus();

        // 监听视频全屏事件,启动前台服务(Android8.0+后台播放必需)
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onShowCustomView(View view, CustomViewCallback callback) {
                super.onShowCustomView(view, callback);
                startForegroundService(new Intent(MainActivity.this, AudioPlaybackService.class));
            }

            @Override
            public void onHideCustomView() {
                super.onHideCustomView();
                // 可根据需求决定是否停止服务,若要后台一直播放可注释此行
                stopService(new Intent(MainActivity.this, AudioPlaybackService.class));
            }
        });
    }

    private void initAudioFocus() {
        audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
                    .setAudioAttributes(new AudioAttributes.Builder()
                            .setUsage(AudioAttributes.USAGE_MEDIA)
                            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                            .build())
                    .setOnAudioFocusChangeListener(focusChangeListener)
                    .build();
            audioManager.requestAudioFocus(audioFocusRequest);
        } else {
            audioManager.requestAudioFocus(focusChangeListener,
                    AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
        }
    }

    // 处理音频焦点变化,确保后台播放不中断
    private final AudioManager.OnAudioFocusChangeListener focusChangeListener = focusChange -> {
        if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            mWebView.onResume();
        }
    };

    @Override
    protected void onPause() {
        super.onPause();
        // 重新请求音频焦点,防止后台时焦点被夺走
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            audioManager.requestAudioFocus(audioFocusRequest);
        } else {
            audioManager.requestAudioFocus(focusChangeListener,
                    AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 释放资源,避免内存泄漏
        if (audioManager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                audioManager.abandonAudioFocusRequest(audioFocusRequest);
            } else {
                audioManager.abandonAudioFocus(focusChangeListener);
            }
        }
        if (mWebView != null) {
            mWebView.destroy();
            mWebView = null;
        }
    }
}

步骤3:配置Manifest和前台服务

Android8.0+要求后台播放音频必须启动前台服务,否则系统会限制甚至终止进程:

1. 添加权限到Manifest

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Android13+ 必需 -->

2. 创建前台服务类

public class AudioPlaybackService extends Service {
    private static final int NOTIFICATION_ID = 1001;
    private static final String CHANNEL_ID = "background_video_channel";

    @Override
    public void onCreate() {
        super.onCreate();
        createNotificationChannel();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 创建前台通知(必须显示,否则会被系统判定为违规)
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("视频后台播放中")
                .setContentText("点击返回播放页面")
                .setSmallIcon(R.drawable.ic_video_notification)
                .setPriority(NotificationCompat.PRIORITY_LOW)
                .build();
        startForeground(NOTIFICATION_ID, notification);
        return START_STICKY;
    }

    // 创建通知渠道(Android8.0+必需)
    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                    "后台视频播放", NotificationManager.IMPORTANCE_LOW);
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel);
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

3. 在Manifest中注册服务

<service android:name=".AudioPlaybackService"
         android:foregroundServiceType="mediaPlayback" /> <!-- Android12+ 必需指定类型 -->

关键注意点

  • 自定义WebView的onPause()不调用父类方法是核心,直接阻止了WebView的媒体暂停逻辑。
  • 前台服务是Android8.0+后台播放的硬性要求,必须实现,否则会被系统限制。
  • 音频焦点处理能减少其他应用打断播放的概率,提升用户体验。

内容的提问来源于stack exchange,提问作者DonatasP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:52:14