framework直播学习笔记--安卓如何实现Launcher启动应用全部变自由窗口Freeform模式

背景:

前些天在学员在学员群里有聊到一个需求,那就是把手机桌面点击应用图标后,不是进行全屏显示,而是都进行自由窗口显示。这个其实有点类似我们windows电脑打开app,每个app都是一个非全屏的窗口,而且可以同时显示很多app的窗口。而不是一直被一个app的全屏窗口覆盖。如下图所示:
在这里插入图片描述
这个需求如何实现呢?那么接下来就来详细实现一下。

实现过程:

先看看B站UP主“千里马学框架”直播笔记:
在这里插入图片描述
实现Launcher端启动App都变成自由窗口模式非全屏模式

核心思路:

这个windowmode需要从FullScreen —> Freeform ,需要在startActivity时候携带相关相关参数,把windowmode和launchBounds进行设置。

步骤如下:

1、寻找到相关的桌面点击App的startActivity的相关方法,考虑对这个方法进行修改参数

2、对startActivity时候携带的ActivityOptions参数进行添加相关windowmode,launcherbounds的设置

launcher启动App的方法堆栈

假设你是一个桌面小白,根本不知道桌面的具体业务代码,请问你有什么方法可以快速定位出桌面是在哪个代码中startActivity吗?
方案1:
硬看代码,这里就需要自己先了解launcher的app图标代码,去寻找app的图标点击onClick方法,一步步寻找
缺点:现在的launcher代码已经变得很复杂,封装很多,基本上直接看代码很难找到对应onClick方法,因为层次很深,而且onClick方法可能还是lamada表达式等,大大增加了寻找难度。
方案2:
打印堆栈方法或者调试,首先有了马哥framework课程的基础后,大家都知道Activity的启动最后都会调用的Instrumentation的execStartActivity方法中

在这里插入图片描述
所以完全可以这里加入Instrumentation加入相关的堆栈或者调试寻找到onClick和startActivity方法

getService:156, ActivityTaskManager (android.app)
execStartActivity:1873, Instrumentation (android.app)
startActivityForResult:5589, Activity (android.app)
startActivityForResult:1834, Launcher (com.android.launcher3)
startActivityForResult:845, QuickstepLauncher (com.android.launcher3.uioverrides)
startActivity:6041, Activity (android.app)
startActivitySafely:379, ActivityContext (com.android.launcher3.views)
startActivitySafely:2196, Launcher (com.android.launcher3)
startActivitySafely:350, QuickstepLauncher (com.android.launcher3.uioverrides)
startAppShortcutOrInfoActivity:351, ItemClickHandler (com.android.launcher3.touch)
onClickAppShortcut:309, ItemClickHandler (com.android.launcher3.touch)
onClick:94, ItemClickHandler (com.android.launcher3.touch)
$r8$lambda$c3IcSovkrXGdCZtXy0f_A5Sz5VA:-1, ItemClickHandler (com.android.launcher3.touch)
onClick:-1, ItemClickHandler$$ExternalSyntheticLambda6 (com.android.launcher3.touch)
onItemClicked:388, QuickstepLauncher (com.android.launcher3.uioverrides)
onClick:-1, QuickstepLauncher$$ExternalSyntheticLambda11 (com.android.launcher3.uioverrides)
performClick:7659, View (android.view)
performClickInternal:7636, View (android.view)
-$$Nest$mperformClickInternal:-1, View (android.view)
run:30156, View$PerformClick (android.view)
handleCallback:958, Handler (android.os)
dispatchMessage:99, Handler (android.os)
loopOnce:205, Looper (android.os)
loop:294, Looper (android.os)
main:8177, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:552, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:971, ZygoteInit (com.android.internal.os)

看一下堆栈是不是很清晰整个startActivity的过程,清楚知道在哪里启动的onClick且一步步到对应的startActivity,这里寻找最贴近context的startActivity,那就是

startActivitySafely:379, ActivityContext (com.android.launcher3.views)

在这里插入图片描述
好到了这里就算寻找到添加的地方

添加相关参数并修复bug:

添加相关的修改部分

default RunnableList startActivitySafely(View v, Intent intent, @Nullable ItemInfo item) {
//省略ActivityOptionsWrapper options = v != null ? getActivityLaunchOptions(v, item): makeDefaultActivityOptions(item != null && item.animationType == DEFAULT_NO_ICON? SPLASH_SCREEN_STYLE_SOLID_COLOR : -1 /* SPLASH_SCREEN_STYLE_UNDEFINED */);UserHandle user = item == null ? null : item.user;Bundle optsBundle = options.toBundle();//省略if (isShortcut) {// Shortcuts need some special checks due to legacy reasons.startShortcutIntentSafely(intent, optsBundle, item);} else if (user == null || user.equals(Process.myUserHandle())) {//开始在原来启动options基础添加相关的WindowingMode和LaunchBoundsoptions.options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);final Rect r = new Rect(0, 0, 1440, (int)(2960 * 0.63f));options.options.setLaunchBounds(r);//添加结束后需要重新转换成toBundleoptsBundle = options.toBundle();// Could be launching some bookkeeping activitycontext.startActivity(intent, optsBundle);} 

上面修改已经有详细注释了,看看添加后的效果:
在这里插入图片描述
看到确实是可以启动Freeform模式的App,不过好像窗口的坐标不是我们设置的,一直显示在左上角,而且状态栏还遮盖了,导致无法拖拉自由窗口,那么到底啥原因导致该问题呢?
这里其实以前学习马哥分屏自由窗口专题时候就有发现类似问题,马哥也带大家手把手解决了,现在依然用老方法打堆栈定位啥原因:

在这里插入图片描述追查到了其实是因为远程动画也有对坐标进行再次设置成0,所以一直左上角,那么是否可以考虑去除桌面启动app远程动画呢?具体桌面去除呢?具体如下:

					//最重要不在复用原启动ActivityOptionsActivityOptions activityOptions = ActivityOptions.makeBasic();activityOptions.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);final Rect r = new Rect(0, 0, 1440, (int)(2960 * 0.63f));activityOptions.setLaunchBounds(r);// Could be launching some bookkeeping activitycontext.startActivity(intent, activityOptions.toBundle());//最重要不在复用原启动ActivityOptions

上面最重要就是不在复用原桌面启动ActivityOptions,自己全新定义ActivityOptions,只有setLaunchWindowingMode和setLaunchBounds,然后startActivity就只带这个ActivityOptions。

最后的完美效果如下:
在这里插入图片描述

具体详情试看方式:
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg

更多framework详细代码和资料参考如下链接

hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 Batch Norm 到 SGD 隐藏的内容

我们仍然不了解机器学习的哪些方面 欢迎来到雲闪世界。令人惊讶的是,机器学习中的一些基本主题仍然不为研究人员所知,尽管它们很基础且常用,但却似乎很神秘。机器学习的有趣之处在于我们构建了可以工作的东西,然后弄清楚它们为什么…

硅纪元视角 | 摩根大通拥抱AI:LLM Suite开启金融行业新篇章!

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

华为OD机试 - 计算三叉搜索树的高度 (python 2024年C卷D卷)

华为OD机试(C卷D卷)2024真题目录(Java & c & python) 题目描述 定义构造三叉搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的…

【字母异位词分组】python刷题记录

R2-字符串篇 class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:#哈希表分组#把每种字母出现次数相同的字符串分到同一组#sort一下好像能分dictdefaultdict(list)for s in strs:asorted(s)#sorted(s)相同的字符串分到同一组dict[.join(a)].appen…

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类(修饰类除外)? 一个 Java 文件中是可以存在多个类的,但是一个 Java 文件中只能存在一个 public 所修饰的类,而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…

如何应对零日威胁:漏洞扫描

零日威胁正变得比以往任何时候都更加危险。5月底至6月初,恶意行为者通过零日攻击接管了众多名人和品牌的TikTok账户。用户声称在打开一条私信后便丧失了账户的控制权。而用于攻击的恶意软件能够在用户不下载或安装任何程序的情况下感染设备。 目前尚不清楚此次事件的…

linux系统巡检及shell脚本

目录 步骤1 系统巡检基本命令 CPU 内存 磁盘 进程 网络、流量 步骤2 shell脚本编写 awk awk常用内置变量 awk正则 实例一 实例二 实例三 实例四 实例五 sed 选项与参数 例一 例二 例三 例四 例五 例六 例七 grep 主要参数 常用用法 例一 例二 例三…

vue 开发环境配置

1. nvm 安装 在 github上下载 最新的 nvm 包 https://github.com/coreybutler/nvm-windows/releases或者在 csdn 上下载(从github上迁移,方便下载)https://download.csdn.net/download/u011171506/89585197 下载后不用修改任何配置&#x…

2024年【广东省安全员B证第四批(项目负责人)】考试报名及广东省安全员B证第四批(项目负责人)模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批(项目负责人)考试报名根据新广东省安全员B证第四批(项目负责人)考试大纲要求,安全生产模拟考试一点通将广东省安全员B证第四批&#x…

系统架构师(每日一练7)

每日一练 1.关于网络延迟正确的是()。答案与解析 A.在对等网络中,网络的延迟大小与网络中的终端数量无关 B.使用路由器进行数据转发所带来的延迟小于交换机, C.使用internet服务器可最大程度地减小网络延迟 D.服务器延迟的主要影响因素是队列延迟和磁盘10延迟 2.以…

【ESP32 IDF SPI硬件驱动W25Q64】

目录 SPISPI介绍idf配置初始化配置通信 驱动代码 SPI SPI介绍 详细SPI介绍内容参考我之前写的内容【ESP32 IDF 软件模拟SPI驱动 W25Q64存储与读取数组】 idf配置 初始化配置 spi_bus_initialize() 参数1 :spi几,例如spi2,spi3 参数2:…

GitHub Actions是什么

目录 GitHub Actions是什么 GitHub Actions的使用方法 示例 注意事项 GitHub Actions配置文件中-工作流的 :Workflow 一、自动化任务执行 二、规范团队协作 三、灵活配置和定制 四、提高开发效率 五、集成GitHub生态 六、可复用性和共享性 仓库中的“Actions”部分…

mac 使用ssh 密钥登录linux 服务器

本地操作 1. 生成SSH密钥对 # your_emailexample.co 自行定义即可 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com"这会提示你输入文件保存位置和密码(密码可以留空): Generating public/private rsa key pair. Enter file in which to save the…

Postman入门(三):创建post请求及请求参数

创建post请求Raw data: 请求方式:Post 请求体:raw,选择json格式 参数{}内数据,点击send即可发送请求 创建post请求Form-data: 请求方式:Post 请求体:form-data, 参数:在form-data内&#…

Lombok的认识

Lombok的作用 Lombok是一个Java库,它可以通过简单的注解形式来帮助开发人员简化Java代码的编写,特别是减少模板代码的书写。具体来说,Lombok的主要作用包括: 减少模板代码:Lombok可以通过注解自动生成getter、setter、…

Javascript 沙漏图案(Hour-glass Pattern)

给定正整数 n,以沙漏形式打印数字模式。示例: 输入:rows_no 7 输出: 1 2 3 4 5 6 7 2 3 4 5 6 7 3 4 5 6 7 4 5 6 7 5 6 7 6 7 7 6 7 5 6 7 4 5 6 7 3 4 5 6 7 2 3 4 5 6 7 1 2 3 4 5 6…

Windows系统安全加固方案:快速上手系统加固指南(上)

无论是个人用户、小型企业还是大型机构,都需要采取措施保护其计算机系统免受各种威胁、系统加固常见的应用场景有个人用户、 AWD 比赛、公共机构以及企业环境等等 文档目录 一、Windows常用命令二、Windows常见端口三、账户安全3.1 默认账户安全3.2 按照用户分配账户…

大数据-44 Redis 慢查询日志 监视器 慢查询测试学习

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

代码随想录算法训练营day25 | 491.递增子序列 、46.全排列 、47.全排列 II、51.N皇后、37.解数独

碎碎念:加油加油,继续坚持 参考:代码随想录 491.递增子序列 题目链接 491.递增子序列 思想 注意结果中不能有重复的子集。 不能排序后处理,因为进行排序以后改变元素顺序,求的递增子序列会改变。 树形图&#xf…

大模型金九银十秋招:AI时代的就业新趋势,收藏我这篇就够了非常详细

随着人工智能技术的飞速发展,大模型(Large Models)在各个领域的应用日益广泛,从自然语言处理到图像识别,从自动驾驶到智能推荐系统,大模型正逐渐成为AI领域的新宠。在这个背景下,大模型的秋招&a…