背景:
近期有的粉丝朋友有请教到一个关于车机系统上画中画的相关功能实现问题,目前他的车机有一个叫做氢桌面的软件,氢桌面是有相关的画中画的功能,具体展示如下:
上面图片可以看出确实这个氢桌面是可以实现多个app的Activity并行运行的功能。
那么粉丝朋友们就对这个氢桌面是如何实现这种多任务并行即画中画功能的呢?他的实现原理是什么呢?
通过dumpsys输出调研实现原理
dumpsys的场景:
在氢桌面上运行两个不同的Activity即并行执行两个应用的Activity
然后再执行如下两个dumpsys命令:
1、dumpsys window windows (主要目的是dump出当前设备上所有窗口的情况,并行的两个Activity就可以通过窗口查看出相关的情况)
2、dumpsys display (主要目的是来展示想的display相关的信息)
dumpsys window windows查看如下:
明显可以看出来,有两个Activity的窗口对应的displayId并不是0,而是10和11.
看到这里大家心里应该也是大概知道了氢桌面画中画的一个原理,本质上实现的方案就是采用了多个虚拟屏,也就是和原来的ActivityView是一个原理,一个ActivityView上面就装载一个虚拟屏幕,这些要并行的Activity都是启动到对应的虚拟屏幕上面既可以。
再通过dumpsys display来再次验证上面的分析
重点看看displayId= 10和11的情况
Display 10:
mDisplayId=10
mLayerStack=10
mHasContent=true
mRequestedMode=0
mRequestedColorMode=0
mDisplayOffset=(0, 0)
mPrimaryDisplayDevice=MyActivityViewVirtualDisplay@255965297
mBaseDisplayInfo=DisplayInfo{"MyActivityViewVirtualDisplay@255965297", uniqueId "virtual:com.mcar.auto.uid,1000,MyActivityViewVirtualDisplay@255965297,0", app 676 x 636, real 676 x 636, largest app 676 x 636, smallest app 676 x 636, mode 73, defaultMode 73, modes [{id=73, width=676, height=636, fps=60.0}], colorMode 0, supportedColorModes [0], hdrCapabilities null, rotation 0, density 160 (160.0 x 160.0) dpi, layerStack 10, appVsyncOff 0, presDeadline 16666666, type VIRTUAL, state OFF, owner com.mcar.auto.uid (uid 1000), removeMode 1}
mOverrideDisplayInfo=DisplayInfo{"MyActivityViewVirtualDisplay@255965297", uniqueId "virtual:com.mcar.auto.uid,1000,MyActivityViewVirtualDisplay@255965297,0", app 676 x 636, real 676 x 636, largest app 676 x 676, smallest app 636 x 636, mode 73, defaultMode 73, modes [{id=73, width=676, height=636, fps=60.0}], colorMode 0, supportedColorModes [0], hdrCapabilities null, rotation 0, density 160 (160.0 x 160.0) dpi, layerStack 10, appVsyncOff 0, presDeadline 16666666, type VIRTUAL, state ON, owner com.mcar.auto.uid (uid 1000), removeMode 1}
Display 11:
mDisplayId=11
mLayerStack=11
mHasContent=true
mRequestedMode=0
mRequestedColorMode=0
mDisplayOffset=(0, 0)
mPrimaryDisplayDevice=MyActivityViewVirtualDisplay@241839220
mBaseDisplayInfo=DisplayInfo{"MyActivityViewVirtualDisplay@241839220", uniqueId "virtual:com.mcar.auto.uid,1000,MyActivityViewVirtualDisplay@241839220,0", app 1149 x 636, real 1149 x 636, largest app 1149 x 636, smallest app 1149 x 636, mode 74, defaultMode 74, modes [{id=74, width=1149, height=636, fps=60.0}], colorMode 0, supportedColorModes [0], hdrCapabilities null, rotation 0, density 160 (160.0 x 160.0) dpi, layerStack 11, appVsyncOff 0, presDeadline 16666666, type VIRTUAL, state OFF, owner com.mcar.auto.uid (uid 1000), removeMode 1}
mOverrideDisplayInfo=DisplayInfo{"MyActivityViewVirtualDisplay@241839220", uniqueId "virtual:com.mcar.auto.uid,1000,MyActivityViewVirtualDisplay@241839220,0", app 1149 x 636, real 1149 x 636, largest app 1149 x 1149, smallest app 636 x 636, mode 74, defaultMode 74, modes [{id=74, width=1149, height=636, fps=60.0}], colorMode 0, supportedColorModes [0], hdrCapabilities null, rotation 0, density 160 (160.0 x 160.0) dpi, layerStack 11, appVsyncOff 0, presDeadline 16666666, type VIRTUAL, state ON, owner com.mcar.auto.uid (uid 1000), removeMode 1}
明显从
DisplayInfo{“MyActivityViewVirtualDisplay@241839220”, uniqueId “virtual:com.mcar.auto.uid,1000,MyActivityViewVirtualDisplay@241839220,0”
这些信息也可以再次确定其实就是创建了对应的虚拟屏幕,这些虚拟屏幕就是ActivityView自带创建的,然后其他的Activity就可以启动到这个虚拟屏幕上,从而实现画中画等Activity并行功能。
更多framework手机车机干货技术,请关注公zhong号“千里马学框架”