Android 12系统源码_分屏模式(二)全屏分屏模式层级树信息

前言

上一篇我们通过一个简单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系统任务栈的特性,我们能够更好的理解分屏模式框架的实现思路。

💡 技术无价,赞赏随心

写文不易,如果本文帮你避开了“八小时踩坑”,或者让你直呼“学到了!”
欢迎扫码赞赏,让我知道这篇内容值得!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值