从Android7.0开始,Google原生加入了应用多窗口支持,相关特性可查看
本文涉及到的代码
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
frameworks/base/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
frameworks/base/core/java/android/app/ActivityManager.java
frameworks/base/packages/SystemUI/src/com/android/systemui/recents/Recents.java
frameworks/base/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java.java
SystemUI在启动过程中会启动Divider,主要是管理分屏分割线的
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
private final Class<?>[] SERVICES = new Class[] {
com.android.systemui.tuner.TunerService.class,
com.android.systemui.keyguard.KeyguardViewMediator.class,
com.android.systemui.recents.Recents.class,
com.android.systemui.volume.VolumeUI.class,
Divider.class,
com.android.systemui.statusbar.SystemBars.class,
com.android.systemui.usb.StorageNotification.class,
com.android.systemui.power.PowerUI.class,
com.android.systemui.media.RingtonePlayer.class,
com.android.systemui.keyboard.KeyboardUI.class,
com.android.systemui.tv.pip.PipUI.class,
com.android.systemui.shortcut.ShortcutKeyDispatcher.class
};
frameworks/base/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
/**
* Controls the docked stack divider.
*/
public class Divider extends SystemUI {
private DividerWindowManager mWindowManager;
private DividerView mView;
...
private DockDividerVisibilityListener mDockDividerVisibilityListener;
...
private ForcedResizableInfoActivityController mForcedResizableController;
主要有几个比较重要的对象
DividerWindowManager--主要是封装了 WindowManager
frameworks/base/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java
/**
* Manages the window parameters of the docked stack divider.
*/
public class DividerWindowManager {
private static final String WINDOW_TITLE = "DockedStackDivider";
private final WindowManager mWindowManager;
private WindowManager.LayoutParams mLp;
private View mView;
public DividerWindowManager(Context ctx) {
mWindowManager = ctx.getSystemService(WindowManager.class);
}
public void add(View view, int width, int height) {
mLp = new WindowManager.LayoutParams(
width, height, TYPE_DOCK_DIVIDER,
FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL
| FLAG_WATCH_OUTSIDE_TOUCH | FLAG_SPLIT_TOUCH | FLAG_SLIPPERY,