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

2020-12-15  本文已影响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>
上一篇 下一篇

猜你喜欢

热点阅读