背景:
前些天在学员在学员群里有聊到一个需求,那就是把手机桌面点击应用图标后,不是进行全屏显示,而是都进行自由窗口显示。这个其实有点类似我们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, ItemClic