美文网首页
去二级页面停止视频播放问题

去二级页面停止视频播放问题

作者: 王家匀匀 | 来源:发表于2020-11-09 15:23 被阅读0次

需求是:
去所有二级页面停止视频播放,点击home 继续播放,熄屏后继续播放,点击出现弹框继续播放,点击弹框中按钮去二级页面停止播放。

(最后一个方案才可以使用)

方案1:

所有跳转前调用停止播放的方法(比如是releasePlayer).

缺点:

  1. 设置地方太多,容易有遗漏。需要设置的有:
    1.1 startActivit开头的;
    1.2 Arout 路由工具类开头的方法,尤其是登录;
    1.3 比如广告跳转等, 页面逻辑中可能的其它跳转工具类
    1.4 弹框跳转
  2. 封装好的弹框方法,不确定最终是否去了二级页面。
    部分弹框,使用地方较多,功能一致,只用工具类统一处理。

方案2:使用activity的onPause 来回调去二级页面。

缺点:

1.home 和 熄屏 都会回调,且无法知道是哪种原因导致回调了onPause;

方案3:判断页面是不是在栈顶,不在栈顶发通知告诉特定activity。监听写在application--registerActivityLifecycleCallbacks---activity onStop/onPause回调中。

已有前提:页面是single task的。
那么可以判断taskList 的顶部是不是只有一个activity(单任务)且这个任务顶部activity类名与特定名称一致。

  ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );

  List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

  if(taskList.get(0).numActivities == 1 &&
     taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
      Log.i(TAG, "This is last activity in the stack");
  }

优点:

可以知道是不是跳转了二级页面,解决了 弹框无法知道有没有去二级页面的问题;

缺点:

3.1 home 去了桌面,这个方案会认为不在栈顶,会关闭视频;
3.2 去二级页面快速回来,因为onPause 是延迟的,导致调用时,页面已经在栈顶了。
看到的效果就是:快速回来没有停止播放,不符合需求。

于是想着:关于home 是不是可以判断栈顶页面是不是桌面?
com.miui.home.launcher.Launcher (小米红米8se,Android 10),看着类名就可以知道:
不同厂商都不一样,适配是个大问题。

所以前3个方案,没有一个完美符合需求。泪!

沿着方案3的思路。判断页面是不是在栈顶,可以根据生命周期回调的activity,这个是最及时的、不存在时间差问题(方法回调有延时,那时候的栈顶activity可能已经 不是想要的activity了);
home 会回调onPause且不在栈顶问题,那么改为OnResume 时检查。不受其他进程影响,且栈顶肯定是当前应用。

方案4:监听写在application--registerActivityLifecycleCallbacks---activity onResume回调中,判断回调中activity不是特定页面。

 boolean mainActivityResumed= !(activity instanceof MainActivity) && (status==MyListener.STATUS_RESUMED);
 if (mainActivityResumed) {
    //todo 发通知,关闭视频

}

那么只要去过二级页面,就会先执行关闭,不管你是不是马上回去;
这样点击home也会继续播放。完美!

相关文章

网友评论

      本文标题:去二级页面停止视频播放问题

      本文链接:https://www.haomeiwen.com/subject/yfqlbktx.html