美文网首页
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 画中画出现多堆栈切换问题

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