MTK Android12 最近历史任务 最左侧的清除历史任务改到页面底部
Android最近历史任务页面 -清除所有- 功能按钮放到底部
文章目录
- 需求
- 需求原因
- 修改的核心文件
- 实现方案
- 最近历史任务基本UI结构了解
- 代码实现
- 思路
- 实现方案
- RecentsView
- TaskOverlayFactory
- 在overview_actions_container
- OverviewActionsView
- 实际效果
- 总结
需求
最近历史任务重,全部清除按钮迁移到页面底部,常显。
需求原因
- 其实很多客户都有反馈过,或者我们自己在使用自己手机时候,最近历史任务界面比较多的时候,右滑到最左边才会出现全部清除按钮,使用不方便,
需要放到下边常显。
如下界面所示,修改之前:

修改的核心文件
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\TaskOverlayFactory.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\views\OverviewActionsView.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\views\RecentsView.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\res\layout\overview_actions_container.xml
#参考资料
- 网上很多参考资料参考,思路永远一致,但是不同芯片平台,相同平台不同安卓版本 还是有一些区别的,根据自己实际环境,调试。
比如:在Android11之前最近历史任务在SystemUI中,在Android11 版本及之后,最近历史任务已经转移到了Launcher 里面了。
- 这里只是给一个思路,我自己在RKAndroid11 和 Rk Android12 上面都实践过,思路一致,修改点少许改动,即可实现。
SystemUI 调整Recents中全部清除按钮位置
Android 11.0 最近任务的全部清除由左边移到下边显示
Android 13.0 Launcher3定制化之最近任务的全部清除由左边移到下边显示
实现方案
最近历史任务基本UI结构了解
| 源文件 | 说明 |
|---|---|
| TaskOverlayFactory | Factory class to create and add an overlays on the TaskView 创建和添加UI 覆盖在TaskView |
| OverviewActionsView | View for showing action buttons in Overview 在UI上展示覆盖的按钮 |
| RecentsView | A list of recent tasks. 最近历史任务列表 |
| overview_actions_container | OverviewActionsView 的布局 |
下面以RK 产品最近历史任务作为基本说明,上面的机器显示的最近历史任务界面中 下方的OverView 层 实际开发需求影藏起来了,不利于说明UI结构。

代码实现
思路
- 上面的UI结构图和列举的UI关联类说明,这里给一下 实现思路
- 将最近历史任务列表里面的清除所有按钮 永久影藏
- 在TaskOverlayFactory 和 OverviewActionsView 中添加UI和功能实现
- 在布局overview_actions_container 中 添加删除功能按钮
实现方案
RecentsView
- 一直影藏 全部清除按钮
在RecentsView 构造方法中,设置清除所有按钮mClearAllButton INVISIBLE
mClearAllButton.setVisibility(View.INVISIBLE); //隐藏左侧的“全部清除”按钮
public RecentsView(Context context, AttributeSet attrs, int defStyleAttr,BaseActivityInterface sizeStrategy) {super(context, attrs, defStyleAttr);。。。。。。。。。。。。。。。mClearAllButton.setOnClickListener(this::dismissAllTasks);mClearAllButton.setVisibility(View.INVISIBLE); //隐藏左侧的“全部清除”按钮。。。。。。。。。。}
- isClearAllHidden 是否隐藏的判断,直接设置为true
/*** Whether the Clear All button is hidden or fully visible. Used to determine if center* displayed page is a task or the Clear All button.** @return True = Clear All button not fully visible, center page is a task. False = Clear All* button fully visible, center page is Clear All button.*/public boolean isClearAllHidden() {//return mClearAllButton.getAlpha() != 1f;Log.d(TAG, " isClearAllHidden.. return true");return true;}
TaskOverlayFactory
1) OverlayUICallbacks 内部接口中添加清除所有的接口方法 clearAllRecentTask()
这里本身定义的有 分享onShare 、 截屏 onScreenshot 的功能按钮
/*** Callbacks the Ui can generate. This is the only way for a Ui to call methods on the* controller.*/public interface OverlayUICallbacks {/** User has indicated they want to share the current task. */void onShare();/** User has indicated they want to screenshot the current task. */void onScreenshot();void clearAllRecentTask();}
2) OverlayUICallbacksImpl 实现上述接口OverlayUICallbacks中的clearAllRecentTask 方法 clearAllRecentTask,定义清除所有的功能
protected class OverlayUICallbacksImpl implements OverlayUICallbacks {protected final boolean mIsAllowedByPolicy;protected final Task mTask;public OverlayUICallbacksImpl(boolean isAllowedByPolicy, Task task) {mIsAllowedByPolicy = isAllowedByPolicy;mTask = task;}public void onShare() {if (mIsAllowedByPolicy) {endLiveTileMode(() -> mImageApi.startShareActivity(null));} else {showBlockedByPolicyMessage();}}@SuppressLint("NewApi")public void onScreenshot() {endLiveTileMode(() -> saveScreenshot(mTask));}@Overridepublic void clearAllRecentTask() {Log.d(TAG, " clearAllRecentTask...");mThumbnailView.getTaskView().getRecentsView().dismissAllTasks(mThumbnailView.getTaskView().getRecentsView());}}
在overview_actions_container
布局文件中添加 UI布局 的UI按钮
<Buttonandroid:id="@+id/recents_clear_all_btn"style="@style/OverviewActionButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:drawableStart="@drawable/ic_screenshot"android:text="@string/recents_clear_all"android:theme="@style/ThemeControlHighlightWorkspaceColor"/>
OverviewActionsView
加载布局,给布局设置接口回调和点击功能
1) onFinishInflate 方法周公加载 布局文件的UI按钮 并设置监按钮点击监听事件
findViewById(R.id.recents_clear_all_btn).setOnClickListener(this);
@Overrideprotected void onFinishInflate() {super.onFinishInflate();View share = findViewById(R.id.action_share);share.setOnClickListener(this);findViewById(R.id.action_screenshot).setOnClickListener(this);findViewById(R.id.recents_clear_all_btn).setOnClickListener(this);if (ENABLE_OVERVIEW_SHARE.get()) {share.setVisibility(VISIBLE);findViewById(R.id.oav_three_button_space).setVisibility(VISIBLE);}}
2) onClick 中回调 view 点击事件,然后回调接口事件 mCallbacks.clearAllRecentTask();
@Overridepublic void onClick(View view) {if (mCallbacks == null) {Log.d(TAG, " mCallbacks == null...");return;}int id = view.getId();if (id == R.id.action_share) {mCallbacks.onShare();} else if (id == R.id.action_screenshot) {mCallbacks.onScreenshot();} else if (id == R.id.recents_clear_all_btn) {Log.d(TAG, "onClick recents_clear_all_btn...");mCallbacks.clearAllRecentTask();}}
3) updateDisabledFlags 更新,永为true
LayoutUtils.setViewEnabled(this, true);
/*** Updates the proper disabled flag to indicate whether OverviewActionsView should be enabled.* Ignores DISABLED_ROTATED flag for determining enabled. Flag is used to enable/disable* buttons individually, currently done for select button in subclass.** @param disabledFlags The flag to update.* @param enable Whether to enable the disable flag: True will cause view to be disabled.*/public void updateDisabledFlags(@ActionsDisabledFlags int disabledFlags, boolean enable) {if (enable) {mDisabledFlags |= disabledFlags;} else {mDisabledFlags &= ~disabledFlags;}//boolean isEnabled = (mDisabledFlags & ~DISABLED_ROTATED) == 0;//LayoutUtils.setViewEnabled(this, isEnabled);Log.d(TAG, " updateDisabledFlags...");LayoutUtils.setViewEnabled(this, true);}
实际效果

总结
- 简单实现了全部清除功能 放到页面下方
- 熟悉最近历史任务的基本功能,基本结构,基本框架
- 其它最近历史任务功能 待 研究
相关文章:
MTK Android12 最近历史任务 最左侧的清除历史任务改到页面底部
Android最近历史任务页面 -清除所有- 功能按钮放到底部 文章目录 需求需求原因 修改的核心文件实现方案最近历史任务基本UI结构了解代码实现思路实现方案RecentsViewTaskOverlayFactory在overview_actions_containerOverviewActionsView 实际效果 总结 需求 最近历史任务重&am…...
TCP协议支持全双工原因TCP发送接收数据是生产者消费者模型
一、TCP支持全双工的原因 TCP协议支持全双工,即使用TCP协议进行通信时,服务端和客户端可以同时进行数据的发送和接收,互不干扰,实现同时双向传输数据。 这是因为使用TCP协议通信时,读写套接字的文件描述符既用来发送…...
文件操作2
7. ⽂件读取结束的判定 7.1 被错误使用的 feof 牢记:在文件读取过程中,不能用 feof 函数的返回值直接来判断文件的是否结束。 feof 的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束。 1. …...
linux中yum和wget指令的区别
yum 和 wget 都是 Linux 上的下载工具,但它们的用途、下载方式和适用场景不同。以下是它们的 主要区别: 1. yum 是软件包管理器,wget 是文件下载工具 功能yumwget用途安装、更新和管理 RPM 软件包从 HTTP/HTTPS/FTP 下载文件工作方式通过 yu…...
《又是二叉树?递归与回溯的经典应用》
“ 我喜欢晴天,你恰好是最好的太阳” 226.翻转二叉树 力扣题目链接(opens new window) 翻转一棵二叉树。 这道题我们可以通过递归法解决,我们只要递归的把每一个节点的左右孩子反转一下就能解决了。 代码如下: var invertTree function(ro…...
Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音
一、前言 在音视频开发中,音量的控制分两块,一个是控制播放器本身的音量,绝大部分场景都是需要控制这个,这个不会影响系统音量的设置。还有一种场景是需要控制系统的音量,因为播放器本身的音量是在系统音量的基础上控…...
从零到精通文本指令:打造个人AI助理的完整指令库(Prompt 指令实操)
文章目录 从零到精通文本指令:打造个人AI助理的完整指令库(Prompt 指令实操)创作指令创作指令**润色指令****扩写指令** 问答指令直接问答材料问答时间逻辑问答 总结、摘要、翻译指令总结信息抽取翻译 从零到精通文本指令:打造个人AI助理的完整指令库(Pr…...
C# NX二次开发:获取模型中所有的草图并获取草图中的对象
大家好,今天接着讲NX二次开发获取草图相关。 获取草图的方法是从workPart中获取,如下面的例子所示: List<Tag> tags new List<Tag>(); SketchCollection sketchCollection workPart.Sketches; …...
基于SpringBoot和MybatisPlus实现通用Controller
基于SpringBoot和MybatisPlus实现通用Controller,只需要创建实体类和mapper接口,单表增删改查接口就已经实现,提升开发效率 1.定义通用controller package com.xian.controller;import cn.hutool.core.map.MapUtil; import com.baomidou.my…...
锤头线和倒锤头线
1、锤头线 是指一根没有上影线或上影线很短,而下影线很长,实体却很小的K线。其K线实体可以是阴线或是阳线,类似于T字。 锤头线的特征有以下三点: 实体很小,下影线长度大于或等于实体的两倍。下影线越长时,如股价处于低位,则上涨的可能性越大。 如股价处于高位,则下跌…...
蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码
文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言:STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…...
STM32上实现简化版的AUTOSAR DEM模块
文章目录 摘要摘要 在一些可以不使用AUTOSAR的项目中,往往也有故障检测和DTC存储的需求,开发一套类似于AUTOSAR DEM模块的软件代码,能够满足DTC的检出和存储,使用FalshDB代替Nvm模块,轻松构建持久化存储,如果你也有这样的需求,请阅读本篇,希望能够帮到你。 /*********…...
如何用终端运行一个SpringBoot项目
在项目开发阶段,为了能够快速测试一个SpringBoot项目的执行结果,就可以采用终端(黑窗)运行查看,因为我们不能要求每一个客户都安装idea并且适配我们的项目版本。 下面将展示打包运行这两个方面的过程: 创建…...
多线程与并发编程 面试专题
多线程与并发编程 面试专题 线程的基础概念基础概念线程的创建线程的状态线程的终止方式start 与 run 区别线程的常用方法 锁锁的分类深入synchronized深入ReentrantLock死锁问题 阻塞队列线程池 线程的基础概念 基础概念 进程与线程 进程:指运行中的程序。 比如我…...
米尔电子-LR3568-烧录鸿蒙
最近开始搞鸿蒙,用的是米尔的LR3568。 开贴记录。 首先要在LR3568上烧录鸿蒙 一、安装准备 1.从米尔电子上下载资料 网址:米尔开发者中心 注册完成后,进入页面,选择我的产品,添加PN和SN PN和SN可以在包装盒上找到 添加到这里…...
Redis Sentinel 及 Redisson 连接问题全解析
在 Kubernetes (k8s) 环境下使用 Redis Sentinel 进行高可用部署时,可能会遇到 failover 超时、Sentinel 误判、Spring Boot 连接失败 以及 Redisson 配置错误等问题。本文将对这些问题进行汇总分析,并提供详细的解决方案。 1️⃣ Redis Sentinel 介绍 …...
基于Flink SQL的实时指标多维分析模型
数据流程介绍 1.创建源表kafka接入消息队列数据,定义字段映射规则; 2.创建目标表es_sink配置Elasticsearch输出; 3.通过多级视图(tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby)实现数据清洗、去重、状态计算&#x…...
算法刷题整理合集(一)
算法刷题整理合集(一) 本篇博客旨在记录自已的算法刷题练习成长,里面注有详细的代码注释以及和个人的思路想法,希望可以给同道之人些许帮助。本人也是算法小白,水平有限,如果文章中有什么错误或遗漏之处&am…...
C++ STL—— String库
在C编程中,字符串操作是几乎每个项目都会涉及的基础功能。C标准模板库(STL)中的string类为我们提供了强大而灵活的工具,使得字符串的处理变得简单高效。无论是字符串的创建、修改、查找,还是复杂的文本处理,…...
【从零开始学习计算机科学】数据库系统(二)关系数据库 与 关系代数
【从零开始学习计算机科学】数据库系统(二)关系数据库 与 关系代数 关系数据库结构化查询语言SQL数据定义语言(DDL)数据查询语言(Data Query Language, DQL)数据操纵语言(Data Manipulation Language, DML)数据控制语言(Data Control Language, DCL)关系型数据库的优…...
DoS攻击防范
一、网络架构优化 使用CDN或反向代理 通过内容分发网络(CDN)或反向代理(如Nginx)分散流量,将请求分发到多个服务器节点,减轻单点压力,同时过滤异常请求。 负载均衡技术 部署负载均衡设备&#…...
Linux驱动开发实战(四):设备树点RGB灯
Linux驱动开发实战(四):设备树点RGB灯 文章目录 Linux驱动开发实战(四):设备树点RGB灯前言一、驱动实现1.1 驱动设计思路1.2 关键数据结构1.3 字符设备操作函数1.4 平台驱动探测函数1.5 匹配表和平台驱动结…...
vue中,watch里,this为undefined的两种解决办法
提示:vue中,watch里,this为undefined的两种解决办法 文章目录 [TOC](文章目录) 前言一、问题二、方法1——使用function函数代替箭头函数()>{}三、方法2——使用that总结 前言 尽量使用方法1——使用function函数代替箭头函数()…...
设计模式C++
针对一些经典的常见的场景, 给定了一些对应的解决方案,这个就叫设计模式。 设计模式的作用:使代码的可重用性高,可读性强,灵活性好,可维护性强。 设计原则: 单一职责原则:一个类只做一方面的…...
前端构建工具进化论:从Grunt到Turbopack的十年征程
前端构建工具进化论:从Grunt到Turbopack的十年征程 一、石器时代:任务自动化工具(2012-2014) 1.1 Grunt:首个主流构建工具 // Gruntfile.js 典型配置 module.exports function(grunt) {grunt.initConfig({concat: {…...
设备预测性维护:企业降本增效的关键密码
在当今竞争激烈的商业战场中,企业犹如一艘在波涛汹涌大海上航行的巨轮,要想乘风破浪、稳步前行,降本增效便是那至关重要的 “船锚”,帮助企业在复杂的市场环境中站稳脚跟。而设备预测性维护,正是开启企业降本增效大门的…...
css基本功
为什么 ::first-letter 是伪元素? ::first-letter 的作用是选择并样式化元素的第一个字母,它创建了一个虚拟的元素来包裹这个字母,因此属于伪元素。 grid布局 案例一 <!DOCTYPE html> <html lang"zh-CN"><head&…...
信号处理抽取多项滤波的数学推导与仿真
昨天的《信号处理之插值、抽取与多项滤波》,已经介绍了插值抽取的多项滤率,今天详细介绍多项滤波的数学推导,并附上实战仿真代码。 一、数学变换推导 1. 多相分解的核心思想 将FIR滤波器的系数 h ( n ) h(n) h(n)按相位分组,每…...
C++双端队列知识点+习题
在C中,双端队列(Deque,发音为“deck”)是标准模板库(STL)中的一种容器适配器,其全称为Double-Ended Queue。它结合了队列和栈的特点,允许在容器的两端(前端和后端&#x…...
【递归、搜索和回溯算法】专题二 :二叉树中的深搜
二叉树中的深搜 深度优先遍历(DFS):一种沿着树或图的深度遍历节点的算法,尽可能深地搜索树或图的分支,如果一条路径上的所有结点都被遍历完毕,就会回溯到上一层,继续找一条路遍历。 在二叉树中…...
