Android 11 自由窗口模式启动app
//未定义
public static final int WINDOWING_MODE_UNDEFINED = 0;
//普通全屏窗口
public static final int WINDOWING_MODE_FULLSCREEN = 1;
//画中画
public static final int WINDOWING_MODE_PINNED = 2;
//分屏主窗口
public static final int WINDOWING_MODE_SPLIT_SCREEN_PRIMARY = 3;
//分屏副窗口
public static final int WINDOWING_MODE_SPLIT_SCREEN_SECONDARY = 4;
//自由窗口
public static final int WINDOWING_MODE_FREEFORM = 5;
//自由窗口模式里面,窗口支持放大缩小以及移动位置,原理是不断的更改Task的边界(用Rect表示),
//然后根据Task的边界来重新缩放Task,从而达到窗口缩放和拖动的作用。
//如何以自由窗口模式启动应用?
//在ActivityStarter拦截启动APP,以自由窗口模式启动
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
int startActivityInner(...)}{
...
computeLaunchParams(r, sourceRecord, targetTask);
...
}
private void computeLaunchParams(ActivityRecord r, ActivityRecord sourceRecord,
Task targetTask) {
final ActivityStack sourceStack = mSourceStack != null ? mSourceStack
: mRootWindowContainer.getTopDisplayFocusedStack();
if (sourceStack != null && sourceStack.inSplitScreenWindowingMode()
&& (mOptions == null
|| mOptions.getLaunchWindowingMode() == WINDOWING_MODE_UNDEFINED)) {
int windowingMode =
targetTask != null ? targetTask.getWindowingMode() : WINDOWING_MODE_UNDEFINED;
if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
if (sourceStack.inSplitScreenPrimaryWindowingMode()) {
windowingMode = WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
} else if (sourceStack.inSplitScreenSecondaryWindowingMode()) {
windowingMode = WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
}
}
if (mOptions == null) {
mOptions = ActivityOptions.makeBasic();
}
mOptions.setLaunchWindowingMode(windowingMode);
}
mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r,
sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams);
mPreferredTaskDisplayArea = mLaunchParams.hasPreferredTaskDisplayArea()
? mLaunchParams.mPreferredTaskDisplayArea
: mRootWindowContainer.getDefaultTaskDisplayArea();
//add text
mPreferredWindowingMode = 5;//mLaunchParams.mWindowingMode;
mOptions.setLaunchBounds(new Rect(10,20,30,40));
mOptions.setLaunchWindowingMode(5);
//add text
}
ActivityOptions副屏启动-CSDN博客
ActivityOptions - Android中文版 - API参考文档 (apiref.com)
支持多窗口模式 | Android Open Source Project (google.cn)
android freeform模式定制桌面系统_android freeform demo实例-CSDN博客
android framework实战开发之WINDOWING_MODE_FREEFORM自由窗口相关_android_learnframework-华为云开发者联盟 (csdn.net)