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

Android Leanback按下返回键无法停止Video Fragment视频播放问题

问题解决:Leanback返回主界面后ExoPlayer后台播放音频

这个问题的核心是ExoPlayer实例没有被正确释放——虽然你调用了getActivity().finish()关闭了页面,但播放器仍持有音频资源在后台继续运行。以下是具体的修复方案:


1. 将ExoPlayer改为Fragment成员变量

你之前在onCreate里声明的player是局部变量,Activity销毁后无法访问到它执行释放操作。把它改成类成员变量,才能在后续生命周期中操作:

@OptIn(markerClass = UnstableApi.class)
public class PlaybackVideoFragment extends VideoSupportFragment {
    private ExoPlayer player; // 移至类成员位置

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ... 原有缓存、数据源初始化代码不变
        // 初始化时直接给成员变量赋值
        player = new ExoPlayer.Builder(getContext())
                .setMediaSourceFactory(mediaSourceFactory)
                .setLoadControl(loadControl)
                .build();
        // ... 其他原有代码不变
    }
}

2. 在Fragment销毁时释放播放器资源

重写Fragment的onDestroyView方法,在这里彻底释放播放器资源并解除与PlayerView的绑定:

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (player != null) {
        player.stop();       // 先停止播放
        player.release();    // 释放所有底层资源
        player = null;
    }
    if (playerView != null) {
        playerView.setPlayer(null); // 断开PlayerView与播放器的关联
    }
}

3. 优化返回键处理(推荐)

Leanback的VideoSupportFragment原生支持重写onBackPressed方法,比使用addOnUnhandledKeyEventListener更符合框架规范,也不会误拦截其他按键事件:

@Override
public boolean onBackPressed() {
    // 先释放播放器再关闭页面
    if (player != null) {
        player.stop();
        player.release();
        player = null;
    }
    if (playerView != null) {
        playerView.setPlayer(null);
    }
    getActivity().finish();
    return true;
}

修改完成后,按下返回键时播放器会先停止并释放资源,再关闭Activity,就不会出现后台播放音频的问题了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:47:30