美文网首页
2020-12-15 画中画出现多堆栈切换问题

2020-12-15 画中画出现多堆栈切换问题

作者: 兣甅 | 来源:发表于2020-12-15 20:30 被阅读0次

本方案只测试了2个堆栈的切换判断,更多的需要再优化测试(在红米7上测试OK)

在BaseActivity中添加代码,使用了AndroidUtilCode三方库
   //<editor-fold defaultstate="collapsed" desc="画中画处理">
  //override fun onResume() {
  //  super.onResume()
  //  (getSystemService(Application.ACTIVITY_SERVICE) as? ActivityManager?)?.let { am ->
  //    val list = ActivityUtils.getActivityList() //获取当前所有页面
  //    val mainTaskId = list.firstOrNull { a -> a is MainActivity }?.taskId ?: -1 //找到主页的taskId
  //    val enableTasks = am.appTasks.filter { t -> t.taskInfo.numActivities > 0 } //筛选有页面的堆栈数据
  //    if (mainTaskId > 0 && mainTaskId == this.taskId && enableTasks.size > 1) { //如果当前页面属于主页的堆栈且还有其他堆栈,则打开其他堆栈
  //      val task = enableTasks[enableTasks.size - 1] //找到最新的task
  //      task.moveToFront() //直接将最新task置顶,这样效率最高,但是存在一个问题,返回后直接返回桌面了(所以要处理finish)
  //    }
  //  }
  //}

  //主要处理画中画恢复后,打开后台管理能看到多个后台运行任务的问题
  override fun onPause() {
    super.onPause()
    (getSystemService(Application.ACTIVITY_SERVICE) as? ActivityManager?)?.let { am ->
      am.appTasks.forEachIndexed { index, appTask -> appTask.setExcludeFromRecents(index > 0) } //false显示,只显示一个任务栏
    }
  }

  //主要是处理画中画关闭会回到桌面的问题
  override fun finish() {
    super.finish()
    (getSystemService(Application.ACTIVITY_SERVICE) as? ActivityManager?)?.let { am ->
      val tasks = am.appTasks //找到所有堆栈
      if (tasks.size > 1 && tasks.any { t -> t.taskInfo.numActivities == 0 }) { //如果有多个堆栈,并且存在空堆栈(由于关闭当前页面导致)
        tasks.lastOrNull { t -> t.taskInfo.numActivities > 0 }?.moveToFront() //则将非空堆栈置顶
        tasks.firstOrNull { t -> t.taskInfo.numActivities == 0 }?.finishAndRemoveTask() //关闭没有页面的堆栈
      }
    }
  }

  //进入画中画[enterPictureInPictureMode的时候调用](处理画中画恢复后二次进入画中画,会回到桌面的问题)
  protected fun enterPipFront() {
    (getSystemService(Application.ACTIVITY_SERVICE) as? ActivityManager?)?.let { am ->
      val tasks = am.appTasks //找到所有堆栈
      val currentTask = tasks.firstOrNull() { t -> t.taskInfo.topActivity == this.componentName } //找到当前页面的Task
      if (tasks.size > 1 && currentTask != null && currentTask.taskInfo.numActivities == 1) { //当前堆栈只有一个页面(该页面进入了PIP)
        tasks.last { t -> t != currentTask }.moveToFront() //将下面一个堆栈置顶
      }
    }
  }

  //退出画中画(处理打开任务栏的时候恢复画中画,然后再打开任务栏出现多个任务的问题)
  protected fun outPipFront() {
    (getSystemService(Application.ACTIVITY_SERVICE) as? ActivityManager?)?.let { am ->
      am.appTasks.forEachIndexed { index, appTask -> appTask.setExcludeFromRecents(index > 0) } //false显示,只显示一个任务栏
    }
  }
  //</editor-fold>

相关文章

  • 2020-12-15 画中画出现多堆栈切换问题

    本方案只测试了2个堆栈的切换判断,更多的需要再优化测试(在红米7上测试OK) 在BaseActivity中添加代码...

  • 提词器 画中画常见问题与解决

    1、展示在画中画页面上 2、双击画中画,大小切换导致变形 3、画中画页面隐藏播放、快进、快退按钮 4、切后台、打开...

  • Java大堆栈分析的经验

    背景 相信有不少人遇到过线上业务出现问题,为排查导出线上业务堆栈,但是最后发现导出的堆栈文件过大,少则2-3G,多...

  • Linux内核——用户堆栈和内核堆栈

    定义 每个进程都有用户堆栈和内核堆栈两个堆栈。进程在用户态时使用用户堆栈,陷入到内核态时便使用内核堆栈。 切换过程...

  • 公司项目总结(2018-10-23)

    1.日期:10.10问题:测试服务出现堆栈溢出问题?解决:递归函数没有出口,函数被重复调用,时间长必将引起堆栈溢出...

  • 4. gdb调试命令

    p,打印命令 bt,查看堆栈信息 f,切换堆栈 s,进入函数内部 n,下一步

  • 系统调用

    系统调用其实是一种中断,中断号为80 系统调用是从用户空间切换到系统空间,涉及到用户堆栈和内核堆栈的切换。 进入中...

  • java.lang.IllegalStateException:

    问题: 原因   在使用DialogFragment,可能会出现这个bug。  从堆栈信息可以看到,错误来自Fra...

  • 2020-12-15

    2020-12-15

  • Android 画中画模式和多个活动的后台管理

    这个博客我们将讨论画中画模式,如何实现它以及如果有多个活动时如何管理后台堆栈。现在,如果应用程序仅包含一个活动并且...

网友评论

      本文标题:2020-12-15 画中画出现多堆栈切换问题

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