前言
上一篇我们通过一个简单demo初步认识了分屏模式。本篇文章我们先具体来看下全屏和分屏场景下的层级树信息,并对二者做个简单比较,以便对分屏模式的实现方案有个更深入的认识。
全屏模式层级树信息
默认情况下一个Activity对应的层级数信息如下所示。
ACTIVITY MANAGER CONTAINERS (dumpsys activity containers)
ROOT type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Display 0 name="内置屏幕" type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][1080,2400] bounds=[0,0][1080,2400]
#4 Leaf:100:100 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#3 HideDisplayCutout:58:99 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#2 OneHanded:67:99 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 FullscreenMagnification:67:99 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:67:99 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 FullscreenMagnification:66:66 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:66:66 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 OneHanded:58:65 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#2 FullscreenMagnification:61:65 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:61:65 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 WindowToken{a9eeb4 type=2026 android.os.BinderProxy@81bb3c6} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 24daadd OplusPrivacyIconTopRight type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WindowToken{31d0400 type=2026 android.os.BinderProxy@d963a83} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 292e439 OplusPrivacyIconTopLeft type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 Leaf:60:60 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 FullscreenMagnification:58:59 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:58:59 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#2 Leaf:56:57 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#3 WindowToken{e269c00 type=2024 android.os.BinderProxy@ee73283} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 1f89c39 ColorSideGestureRight type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#2 WindowToken{4b6b7e8 type=2024 android.os.BinderProxy@a082d0b} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 3452e01 ColorSideGestureLeft type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 WindowToken{f5f8c9b type=2024 android.os.BinderProxy@669ff95} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 cb80011 pip-dismiss-overlay type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WindowToken{266132e type=2019 android.os.BinderProxy@d49a130} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 69558c7 NavigationBar0 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 HideDisplayCutout:32:55 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 OneHanded:32:55 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 FullscreenMagnification:33:55 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:33:55 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:32:32 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WindowedMagnification:0:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#4 HideDisplayCutout:18:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 OneHanded:18:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 FullscreenMagnification:18:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:18:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#3 OneHanded:17:17 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 FullscreenMagnification:17:17 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:17:17 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WindowToken{ac5ea1e type=2040 android.os.BinderProxy@be082a0} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 db28cc NotificationShade type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#2 HideDisplayCutout:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 OneHanded:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 FullscreenMagnification:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 OneHanded:15:15 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 FullscreenMagnification:15:15 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:15:15 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WindowToken{dc48f85 type=2000 android.os.BinderProxy@773a9ef} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 649d1da StatusBar type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 HideDisplayCutout:0:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 OneHanded:0:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 ImePlaceholder:13:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 ImeContainer type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WindowToken{4523f9a type=2011 android.os.Binder@3971c45} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 44914d7 InputMethod type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 FullscreenMagnification:0:12 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#2 Leaf:3:12 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WindowToken{1ce9e14 type=2038 android.os.BinderProxy@faa345a} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 6c73c26 ShellDropTarget type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 DefaultTaskDisplayArea type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#3 Task=74 type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 ActivityRecord{188c745 u0 com.example.empty/.MainActivity} t74} type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 9389b1e com.example.empty/com.example.empty.MainActivity type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#2 Task=1 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Task=6 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 ActivityRecord{1cf0804 u0 com.android.launcher/.Launcher} t6} type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 aace6bb com.coloros.assistantscreen type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 fc1a4e5 com.android.launcher/com.android.launcher.Launcher type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 Task=2 type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Task=3 type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#1 Task=5 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Task=4 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 Leaf:0:1 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 WallpaperWindowToken{1f72cd0 token=android.os.Binder@7bd8e64} type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
#0 138dce5 com.android.systemui.ImageWallpaper type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
截取以上层级树和MainActivity相关的关键信息,可以绘制成如下结构图
分屏模式层级树信息
当Activity进入分屏模式,分屏模式对应的层级数信息如下所示。
对应的层级输信息如下:
ACTIVITY MANAGER CONTAINERS (dumpsys activity containers)
ROOT type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Display 0 name="内置屏幕" type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][1800,2880] bounds=[0,0][1800,2880]
#2 Leaf:38:38 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 HideDisplayCutout:32:37 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#2 OneHanded:34:37 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 FullscreenMagnification:34:37 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:34:37 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 FullscreenMagnification:33:33 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:33:33 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{3c3db5d type=2015 android.view.ViewRootImpl$W@f509134} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 e28ecd2 MAGIC-POINTER type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 OneHanded:32:32 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:32:32 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowedMagnification:0:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#6 HideDisplayCutout:26:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 OneHanded:26:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#2 FullscreenMagnification:29:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:29:31 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{888055c type=2016 android.os.BinderProxy@192f7e2} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 56cb02e MiuiShellDropTarget type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 Leaf:28:28 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 WindowToken{fdd2924 type=2027 android.os.BinderProxy@70a9c51} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 f2cae53 GestureStubRight type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{2b2a6fb type=2027 android.os.BinderProxy@19ef08a} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 613c318 GestureStubLeft type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 FullscreenMagnification:26:27 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:26:27 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#5 Leaf:24:25 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#2 WindowToken{b5f1fa2 type=2024 android.os.BinderProxy@31ad76d} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 c700433 SecondaryHomeHandle0 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 WindowToken{e1ce56e type=2024 android.os.BinderProxy@880b873} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 6a11970 MiuiShellDragTips type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{c2a7b13 type=2019 android.os.BinderProxy@5d9fb4d} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 3486150 NavigationBar0 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#4 HideDisplayCutout:18:23 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 OneHanded:18:23 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 FullscreenMagnification:18:23 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:18:23 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 WindowToken{ca5c233 type=2017 android.os.BinderProxy@3fd15a2} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 a3169f0 control_center type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{20292ee type=2017 android.os.BinderProxy@65a1869} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 5f1438f NotificationModalWindowManager type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#3 OneHanded:17:17 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 FullscreenMagnification:17:17 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:17:17 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{29f53e9 type=2040 android.os.BinderProxy@36256b3} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 89de86e NotificationShade type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#2 HideDisplayCutout:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 OneHanded:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 FullscreenMagnification:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:16:16 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 OneHanded:15:15 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 FullscreenMagnification:15:15 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:15:15 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{63b9188 type=2000 android.os.BinderProxy@5c41d7a} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 4e49721 StatusBar type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 HideDisplayCutout:0:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 OneHanded:0:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 ImePlaceholder:13:14 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 ImeContainer type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{b63fa2b type=2011 android.os.Binder@4a1d27a} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 f1b863b InputMethod type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 FullscreenMagnification:0:12 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#2 Leaf:3:12 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#3 WindowToken{2d7fc1b type=2038 android.os.BinderProxy@8e5bf6a} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 a660315 ShellDropTarget type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#2 WindowToken{2885f6 type=2005 android.os.Binder@2335291} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 WindowToken{400ced2 type=2005 android.os.Binder@66055d} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WindowToken{203b5fc type=2001 android.os.BinderProxy@b18c6ef} type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 9ef7485 Apps Dock type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 DefaultTaskDisplayArea type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#2 Task=6 type=standard mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 Task=8 type=standard mode=multi-window override-mode=multi-window requested-bounds=[0,0][888,2880] bounds=[0,0][888,2880]
#0 Task=575 type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][888,2880]
#0 ActivityRecord{9fd546d u0 com.xiaomi.market/.ui.MarketTabActivity t575} type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][888,2880]
#0 d2fe292 com.xiaomi.market/com.xiaomi.market.ui.MarketTabActivity type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][888,2880]
#0 Task=7 type=standard mode=multi-window override-mode=multi-window requested-bounds=[912,0][1800,2880] bounds=[912,0][1800,2880]
#0 Task=577 type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[912,0][1800,2880]
#0 ActivityRecord{7f6d2c8 u0 com.tencent.qqmusic/.activity.baseactivity.StartUpPrivacyPolicyActivity t577} type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[912,0][1800,2880]
#1 226f10e com.tencent.qqmusic/com.tencent.qqmusic.activity.baseactivity.StartUpPrivacyPolicyActivity type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[912,0][1800,2880]
#0 b7da241 com.tencent.qqmusic/com.tencent.qqmusic.activity.baseactivity.StartUpPrivacyPolicyActivity type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[912,0][1800,2880]
#1 Task=1 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Task=2 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 ActivityRecord{f6b8e80 u0 com.miui.home/.launcher.Launcher t2} type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 9c821dd com.miui.home/com.miui.home.launcher.Launcher type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Task=3 type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 Task=5 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,2880][1800,4320] bounds=[0,2880][1800,4320]
#0 Task=4 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 Leaf:0:1 type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#1 WallpaperWindowToken{573fb8d token=android.os.BinderProxy@a095424} type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 4ea0f45 com.miui.miwallpaper.wallpaperservice.MiuiKeyguardPictorialWallpaper type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 WallpaperWindowToken{211710e token=android.os.Binder@4c7d837} type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
#0 2a8425f com.miui.miwallpaper.wallpaperservice.ImageWallpaper type=undefined mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1800,2880]
截取以上层级树和MainActivity、SecondActivity相关的关键信息,可以绘制成如下结构图。
分屏模式SurfaceFlinger信息
Display 0 (active) HWC layers:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Layer name
Z | Window Type | Comp Type | Transform | Disp Frame (LTRB) | Source Crop (LTRB) | Frame Rate (Explicit) (Seamlessness) [Focused]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Wallpaper BBQ wrapper#79
(s:79 p:2396 d:0 r:0)
rel 0 | 2013 | DEVICE | 0 | 0 0 1080 2400 | 49.0 109.0 1031.0 2291.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
com.android.launcher/com.android.launcher.Launcher#170
(s:170 p:2749 d:0 r:0)
rel 0 | 1 | DEVICE | 0 | 0 0 1080 2400 | 0.0 0.0 1080.0 2400.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
com.example.empty/com.example.empty.MainActivity#172
(s:172 p:7315 d:0 r:0)
rel 0 | 1 | DEVICE | 0 | 0 0 1080 1455 | 0.0 0.0 1080.0 1455.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
SplitControlBar#181
(s:181 p:2396 d:0 r:0)
rel 0 | 0 | DEVICE | 0 | 0 0 1080 108 | 0.0 0.0 1080.0 108.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
com.example.empty/com.example.empty.SecondActivity#171
(s:171 p:7315 d:0 r:0)
rel 0 | 1 | DEVICE | 0 | 0 1473 1080 2400 | 0.0 0.0 1080.0 927.0 | [*]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
SplitControlBar#185
(s:185 p:2396 d:0 r:0)
rel 0 | 0 | CLIENT | 0 | 0 1473 1080 1581 | 0.0 0.0 1080.0 108.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
StageCoordinatorSplitDivider#140
(s:140 p:2396 d:0 r:0)
rel 0 | 0 | CLIENT | 0 | 0 1392 1080 1536 | 0.0 0.0 1080.0 144.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
SplitScreenImmersiveControl#190
(s:190 p:1715 d:0 r:0)
rel 0 | 2038 | CLIENT | 0 | 539 1199 540 1200 | 0.0 0.0 1.0 1.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
NavigationBar0#81
(s:81 p:2396 d:0 r:0)
rel 0 | 2019 | CLIENT | 0 | 0 2268 1080 2400 | 0.0 0.0 1080.0 132.0 | [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
- SplitControlBar#181 MainActivity对应的菜单栏
- SplitControlBar#185 SecondActivity对应的菜单栏
- StageCoordinatorSplitDivider 分屏模式中间的分割线
总结
经过对比可以发现
- 当应用Activity处于全屏模式的时候,其父类ActivityRecord,ActivityRecord的父类为Task,该Task直接挂载在DefaultTaskDisplayArea叶子节点上。
- 而当应用Activity处于分屏模式的时候,其父类为ActivityRecord,ActivityRecord的父类为Task,系统对该Task进行了多层task包装,处于分屏场景的Activity最终共有一个根Task,然后该Task直接挂载在DefaultTaskDisplayArea叶子节点上。
理解了这点,再结合Android系统任务栈的特性,我们能够更好的理解分屏模式框架的实现思路。
💡 技术无价,赞赏随心
写文不易,如果本文帮你避开了“八小时踩坑”,或者让你直呼“学到了!”
欢迎扫码赞赏,让我知道这篇内容值得!