栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Android Q] 快捷键进SplitWindow Flow分析--SystemUI部分

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Android Q] 快捷键进SplitWindow Flow分析--SystemUI部分

  在支持multiwindow的应用界面下长按导航栏的Recents键,可以直接触发进入Split Screen Mode,在Split Screen Mode下面长按则会触发退出,笔者好奇实现flow,因此简单trace了下相关流程,具体过程如下。

  长按NavigationBarFragment的按键操作,最终会进到如下函数中处理,在没有开启lock task mode或开启lock task mode但没有开启Touch Exploration功能时,flow会进入到onLongPressRecents方法,触发Split Screen Mode的flow。

  从如下调用可以看出,触发多split window mode需要满足多个条件。

  首先设备要配置开启Recents,即在config_systemUIServiceComponents中加入Rencents这个类。

  这样启动SystemUIService的时候,会调用SystemUIApplication.startServicesIfNeeded(),

startServicesIfNeeded中解析这个配置,通过这个类执行反射创建Rencents实例对象,

  随后执行Recents.start()将新建的实例存入SystemUI的mComponents这个map上,后续就可以通过getComponent(Recents.class)获取到对应的实例对象。

  接着就是设备有UI显示,属于非低内存设备(低内存设备是不支持这个功能的),且配置支持多窗口模式,

  即系统中,需要在如下位置将config_supportsMultiWindow设置为true

  最后就是UI上有足够的空间满足Split window mode的显示

  在满足如上一系列条件后,会调用StatusBar.toggleSplitScreenMode。通过getDockSide可以获取到当前是否已经进入到分屏模式,该接口返回非DOCKED_INVALID时,表示当前已在分屏模式,则进入else分支,执行退出分屏模式的flow。

  如果当前不在分屏模式下,则根据Navigation Bar所在位置决定应用分屏时PrimaryStack显示的位置。

  具体有如上两种模式,SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT表示横屏(Portrait)时Primary显示在上边,竖屏(Lanscape)时则处于远离导航栏的那边。

  接下来就是走如下调用进入到splitPrimaryTask上,

  其中,mImpl是RecentsImplementation对象,通过createRecentsImplementationFromConfig创建。

  通过如下代码可以看到,mImpl是依据config_recentsComponent这个配置反射获取到对应的类实例对象

  在Android 10上,有两套实现LegacyRecentsImpl和OverviewProxyRecentsImpl,我们就看后者,也就是新的这套。

Diff - 2dbcf0973bd04c2b66e6280a3ce7363876ce7108^! - frameworks_base - Gitiles

  具体代码如下,我们执行splitPrimaryTask时,传下来的参数,在这里有用的就前两个,stackCreateMode决定Primary Task显示的位置;initialBounds用来指示显示边界,长按recents键时,这个值为null,因此在此处会初始化为全屏显示的大小。从如下代码可以看出,进入到分屏模式,需要当前运行的任务不是home和recents UI下面,同时也没开启画中画模式,

Android 7.0中的多窗口实现解析

  如当前应用支持分屏模式时,则会调用AMS.setTaskWindowingModeSplitScreenPrimary传入当前task id和上文提及的两个分屏参数,开启分屏模式,执行成功时,通知divider显示出来。如应用不支持分屏显示,则会弹出toast提示不支持分屏模式。触发分屏模式的接口调用为ActivityManagerWrapper.setTaskWindowingModeSplitScreenPrimary,也就是开始进入ATMS部分的实现了。我们会在下一篇介绍调用流程。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/631383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号