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>