自由窗口打开配置
aosp默认没有开启自由窗口模式,可以使用如下命令开启
1 | adb shell settings put global enable_freeform_support 1 |
或者在开发者选项中打开
- 强制将Activity设置为可调整大小
- 启用可自由调整的窗口
开启之后可以在最近任务栏窗口应用图标选择【自由窗口】打开自由窗口应用。
进入freeform分析
上层启动部分
第一步点击按钮开启的堆栈
1 | com.android.systemui.shared.system.ActivityManagerWrapper.startActivityFromRecents(ActivityManagerWrapper.java:279) |
MultiWindowSystemShortcut.onClick对应代码
1 | //packages/apps/Launcher3/quickstep/src/com/android/quickstep/TaskShortcutFactory.java |
SystemServer部分
点击时候会触发startActivityFromRecents,会跨进程调到ActivityTaskManagerService
1 | com.android.server.wm.Task.moveToFrontInner(Task.java:4674) |
接下来重下ActivityTaskSupervisor.startActivityFromRecents
1 | //frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java |
findTaskToMoveToFront方法
1 |
|
显示大小
1 | TaskShortcutFactory FREE_FORM = new MultiWindowFactory(R.drawable.ic_split_screen, |
显示大小设置的50, 50, 200, 200,但是事件显示的大小不是这个大小
1 | adb shell am stack list |
setBounds堆栈打印日志
1 | android.app.WindowConfiguration.setBounds(WindowConfiguration.java:289) |
1 | //TaskFragment.resolveOverrideConfiguration |
50, 50, 200, 200最终变成50,84,470,504,原因是
density=3.5,default_minimal_size_resizable_task设置了120,最小宽高是120*3.5=420
原数据宽度150,不满足最小,宽度最小420,200就会变成470
顶部会变成状态栏的高度84,高度84+420 = 504
计算下,这些数据就能对的上了。
DecorCaptionView
对应打开之后顶部显示的一些不属于Activity的按钮区域,在DecorView增加的一个DecorCaptionView,可以控制窗口。
1 | View Hierarchy: |
打开对应的堆栈
1 | com.android.internal.policy.DecorView.createDecorCaptionView(DecorView.java:2248) |
handleRelaunchActivity时候进行的创建,systemserver端触发的操作
1 | com.android.server.wm.ActivityRecord.relaunchActivityLocked |
自由窗口的移动
自由窗口的移到拖拽在顶部的CaptionView部分
应用部分
1 | //frameworks/base/core/java/com/android/internal/widget/DecorCaptionView.java |
sytemServer部分
1 | //frameworks/base/services/core/java/com/android/server/wm/Session.java |
窗口大小变化
1 | //frameworks/base/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java |
原生自由窗口存在拖动时一直resize导致界面在刷新,然后外面拖动的区域很难发现。后面优化下拖动效果再添加下外边框。
桌面启动应用全部变freeform模式
设置LaunchWindowingMode(WINDOWING_MODE_FREEFORM)
1 | //ActivityContext.java |