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
相关产品推荐
相关产品推荐

