Android U 多任务启动分屏——整体流程介绍

news2024/9/21 16:30:13

原生的分屏功能是在多任务中,点击应用图标选择分屏,在选择多任务中的其他应用进行分屏
在这里插入图片描述

整体流程

层级结构

#1 DefaultTaskDisplayArea type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
 #1 Task=3 type=standard mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1440,2960]
  #1 Task=4 type=standard mode=multi-window override-mode=multi-window requested-bounds=[0,1498][1440,2960] bounds=[0,1498][1440,2960]
   #0 Task=55 type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,1498][1440,2960]
    #0 ActivityRecord{c8a85d8 u0 com.android.dialer/.main.impl.MainActivity t55} type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,1498][1440,2960]
     #0 17b29c2 com.android.dialer/com.android.dialer.main.impl.MainActivity type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,1498][1440,2960]
  #0 Task=5 type=standard mode=multi-window override-mode=multi-window requested-bounds=[0,0][1440,1463] bounds=[0,0][1440,1463]
   #0 Task=61 type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,1463]
    #0 ActivityRecord{a029103 u0 com.android.messaging/.ui.conversationlist.ConversationListActivity t61} type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,1463]
     #0 d3dd038 com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity type=standard mode=multi-window override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1440,1463]

对应如下树状图
在这里插入图片描述

各模块责任与堆栈

Launcher

1.确定分屏上部分,做好相关显示动画,等待选择下分屏

Launcher: 	at com.android.quickstep.views.RecentsView.createInitialSplitSelectAnimation(RecentsView.java:3196)
Launcher: 	at com.android.quickstep.views.RecentsView.createTaskDismissAnimation(RecentsView.java:3493)
Launcher: 	at com.android.quickstep.views.RecentsView.createSplitSelectInitAnimation(RecentsView.java:4636)
Launcher: 	at com.android.launcher3.uioverrides.RecentsViewStateController.handleSplitSelectionState(RecentsViewStateController.java:139)
Launcher: 	at com.android.launcher3.uioverrides.RecentsViewStateController.setStateWithAnimationInternal(RecentsViewStateController.java:109)
Launcher: 	at com.android.launcher3.uioverrides.BaseRecentsViewStateController.setStateWithAnimation(BaseRecentsViewStateController.java:91)
Launcher: 	at com.android.launcher3.uioverrides.BaseRecentsViewStateController.setStateWithAnimation(BaseRecentsViewStateController.java:61)
Launcher: 	at com.android.launcher3.statemanager.StateManager.createAnimationToNewWorkspaceInternal(StateManager.java:350)
Launcher: 	at com.android.launcher3.statemanager.StateManager.goToStateAnimated(StateManager.java:285)
Launcher: 	at com.android.launcher3.statemanager.StateManager.goToState(StateManager.java:273)
Launcher: 	at com.android.launcher3.statemanager.StateManager.goToState(StateManager.java:152)
Launcher: 	at com.android.launcher3.statemanager.StateManager.goToState(StateManager.java:145)
Launcher: 	at com.android.quickstep.views.LauncherRecentsView.initiateSplitSelect(LauncherRecentsView.java:210)
Launcher: 	at com.android.quickstep.views.TaskView.initiateSplitSelect(TaskView.java:1767)
Launcher: 	at com.android.quickstep.TaskShortcutFactory$SplitSelectSystemShortcut.onClick(TaskShortcutFactory.java:124)
Launcher: 	at com.android.quickstep.views.TaskMenuView$$ExternalSyntheticLambda3.onClick(Unknown Source:2)
Launcher: 	at android.view.View.performClick(View.java:7659)
Launcher: 	at android.view.View.performClickInternal(View.java:7636)
Launcher: 	at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
Launcher: 	at android.view.View$PerformClick.run(View.java:30156)
Launcher: 	at android.os.Handler.handleCallback(Handler.java:958)
Launcher: 	at android.os.Handler.dispatchMessage(Handler.java:99)
Launcher: 	at android.os.Looper.loopOnce(Looper.java:205)
Launcher: 	at android.os.Looper.loop(Looper.java:294)
Launcher: 	at android.app.ActivityThread.main(ActivityThread.java:8177)
Launcher: 	at java.lang.reflect.Method.invoke(Native Method)
Launcher: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
Launcher: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

2.确定选择下分屏,播放相关动画,调用SytemUI接口进入到真正分屏

Launcher: 	at com.android.quickstep.views.RecentsView.confirmSplitSelect(RecentsView.java:4716)
Launcher: 	at com.android.quickstep.views.TaskView.confirmSecondSplitSelectApp(TaskView.java:762)
Launcher: 	at com.android.quickstep.views.TaskView.onClick(TaskView.java:746)
Launcher: 	at com.android.quickstep.views.TaskView.$r8$lambda$2dErZAYzRAWboZR0vn31kIz_HGY(Unknown Source:0)
Launcher: 	at com.android.quickstep.views.TaskView$$ExternalSyntheticLambda2.onClick(Unknown Source:2)
Launcher: 	at android.view.View.performClick(View.java:7659)
Launcher: 	at android.view.View.performClickInternal(View.java:7636)
Launcher: 	at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
Launcher: 	at android.view.View$PerformClick.run(View.java:30156)
Launcher: 	at android.os.Handler.handleCallback(Handler.java:958)
Launcher: 	at android.os.Handler.dispatchMessage(Handler.java:99)
Launcher: 	at android.os.Looper.loopOnce(Looper.java:205)
Launcher: 	at android.os.Looper.loop(Looper.java:294)
Launcher: 	at android.app.ActivityThread.main(ActivityThread.java:8177)
Launcher: 	at java.lang.reflect.Method.invoke(Native Method)
Launcher: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
Launcher: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
pendingAnimation.addEndListener(aBoolean -> {
            mSplitSelectStateController.launchSplitTasks(
                    aBoolean1 -> RecentsView.this.resetFromSplitSelectionState());
            InteractionJankMonitorWrapper.end(InteractionJankMonitorWrapper.CUJ_SPLIT_SCREEN_ENTER);
        });
Launcher: 	at com.android.quickstep.util.SplitSelectStateController.launchTasksRefactored(SplitSelectStateController.java:412)
Launcher: 	at com.android.quickstep.util.SplitSelectStateController.launchTasks(SplitSelectStateController.java:329)
Launcher: 	at com.android.quickstep.util.SplitSelectStateController.launchSplitTasks(SplitSelectStateController.java:258)
Launcher: 	at com.android.quickstep.views.RecentsView.lambda$confirmSplitSelect$34(RecentsView.java:4718)
Launcher: 	at com.android.quickstep.views.RecentsView.$r8$lambda$uSHMT-0i9azkpL6YW9McOOFyjVQ(Unknown Source:0)
Launcher: 	at com.android.quickstep.views.RecentsView$$ExternalSyntheticLambda26.accept(Unknown Source:4)
Launcher: 	at com.android.launcher3.anim.AnimatorListeners$EndStateCallbackWrapper.onAnimationEnd(AnimatorListeners.java:80)
Launcher: 	at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:711)
Launcher: 	at android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda1.call(Unknown Source:4)
Launcher: 	at android.animation.Animator.callOnList(Animator.java:669)
Launcher: 	at android.animation.Animator.notifyListeners(Animator.java:608)
Launcher: 	at android.animation.Animator.notifyEndListeners(Animator.java:633)
Launcher: 	at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1306)
Launcher: 	at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1566)
Launcher: 	at android.animation.ValueAnimator.pulseAnimationFrame(ValueAnimator.java:1582)
Launcher: 	at android.animation.AnimatorSet.pulseFrame(AnimatorSet.java:1314)
Launcher: 	at android.animation.AnimatorSet.handleAnimationEvents(AnimatorSet.java:1297)
Launcher: 	at android.animation.AnimatorSet.doAnimationFrame(AnimatorSet.java:1197)
Launcher: 	at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:328)
Launcher: 	at android.animation.AnimationHandler.-$$Nest$mdoAnimationFrame(Unknown Source:0)
Launcher: 	at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:86)
Launcher: 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1337)
Launcher: 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1348)
Launcher: 	at android.view.Choreographer.doCallbacks(Choreographer.java:952)
Launcher: 	at android.view.Choreographer.doFrame(Choreographer.java:878)
Launcher: 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1322)
Launcher: 	at android.os.Handler.handleCallback(Handler.java:958)
Launcher: 	at android.os.Handler.dispatchMessage(Handler.java:99)
Launcher: 	at android.os.Looper.loopOnce(Looper.java:205)
Launcher: 	at android.os.Looper.loop(Looper.java:294)
Launcher: 	at android.app.ActivityThread.main(ActivityThread.java:8177)
Launcher: 	at java.lang.reflect.Method.invoke(Native Method)
Launcher: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
Launcher: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

SystemUiProxy调用ISplitScreen.aidl进行跨进程通信到SystemUI进程
在这里插入图片描述

SytemUI

SplitScreenController实现了ISplitScreen.aidl
在这里插入图片描述

SplitScreen: 	at android.window.WindowOrganizer.startNewTransition(WindowOrganizer.java:94)
SplitScreen: 	at com.android.wm.shell.transition.Transitions.startTransition(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:1121)
SplitScreen: 	at com.android.wm.shell.splitscreen.SplitScreenTransitions.startEnterTransition(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:345)
SplitScreen: 	at com.android.wm.shell.splitscreen.StageCoordinator.startWithTask(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:701)
SplitScreen: 	at com.android.wm.shell.splitscreen.StageCoordinator.startTasks(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:623)
SplitScreen: 	at com.android.wm.shell.splitscreen.SplitScreenController$ISplitScreenImpl.lambda$startTasks$11(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:1157)
SplitScreen: 	at com.android.wm.shell.splitscreen.SplitScreenController$ISplitScreenImpl.$r8$lambda$UuHBVv3bzz4CDOdyAqlv4kaRHgY(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:0)
SplitScreen: 	at com.android.wm.shell.splitscreen.SplitScreenController$ISplitScreenImpl$$ExternalSyntheticLambda14.accept(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:0)
SplitScreen: 	at com.android.wm.shell.common.ExecutorUtils.lambda$executeRemoteCallWithTaskPermission$1(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:60)
SplitScreen: 	at com.android.wm.shell.common.ExecutorUtils.$r8$lambda$s8eUOdyrqpqzzyFwAMGxO-MaCg4(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:0)
SplitScreen: 	at com.android.wm.shell.common.ExecutorUtils$$ExternalSyntheticLambda1.run(go/retraceme d8ee0e3eecdad3cdc77c111ff5591ebe26372c47d62ba59187c5ecf96366b561:0)
SplitScreen: 	at android.os.Handler.handleCallback(Handler.java:958)
SplitScreen: 	at android.os.Handler.dispatchMessage(Handler.java:99)
SplitScreen: 	at android.os.Looper.loopOnce(Looper.java:205)
SplitScreen: 	at android.os.Looper.loop(Looper.java:294)
SplitScreen: 	at android.os.HandlerThread.run(HandlerThread.java:67)

1.对上分屏的Task进行启动

2.设置好对应的bound到configration中

3.对分屏的RootTask进行排位到最顶部

4.对下分屏的Task进行启动

对Task的操作均会保存到WindowContainerTransaction对象中,最后通过WindowOrganizer调用IWindowOrganizerController.aidl进行跨进程通信到SystemServer进程进程Task操作
在这里插入图片描述

注:SplitLayout初始化分屏的分割线的布局的流程,从代码上看,如果shell动画开关是打开的,那么该流程在1和2之间执行;反之,则会在4之后,即窗口relayout流程中通过shell动画流程调用。

SystemServer

在这里插入图片描述

WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.applyTransaction(WindowOrganizerController.java:597)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.applyTransaction(WindowOrganizerController.java:484)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.applyTransaction(WindowOrganizerController.java:502)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.lambda$startTransition$3(WindowOrganizerController.java:314)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.$r8$lambda$v_6sOG-rerjgO2wQxXrUcgpnWaU(WindowOrganizerController.java:0)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController$$ExternalSyntheticLambda3.onCollectStarted(R8$$SyntheticClass:0)
WindowOrganizerController: 	at com.android.server.wm.TransitionController.startCollectOrQueue(TransitionController.java:1306)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.startTransition(WindowOrganizerController.java:310)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.startNewTransition(WindowOrganizerController.java:271)
WindowOrganizerController: 	at android.window.IWindowOrganizerController$Stub.onTransact(IWindowOrganizerController.java:245)
WindowOrganizerController: 	at com.android.server.wm.WindowOrganizerController.onTransact(WindowOrganizerController.java:188)
WindowOrganizerController: 	at android.os.Binder.execTransactInternal(Binder.java:1344)
WindowOrganizerController: 	at android.os.Binder.execTransact(Binder.java:1275)

WindowOrganizerController实现了IWindowOrganizerController.aidl
其接收SystemUI中的命令来对Task进行不同的操作
applyTransaction中对Task区域大小bounds变化以及RootTask的reorder和startTask等操作进行了处理

交互简图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统架构师软考】重难点划分及学习要点(一)

目录 引言 综合知识 案例分析 案例分析题型及选择策略 历年案例分析题型及分值分布 学习与应试策略 论文 考试规则 写作要求与技巧 忌讳与注意事项 常见题目与考查方向 引言 系统架构师软考是许多IT从业人员进阶的必经之路。面对这门考试,如何有效划分重难…

spring揭秘14-JdbcTemplate概述与使用操作对象访问数据

文章目录 【README】【1】JdbcTemplate概述【1.1】Jdbc原生api操作数据库【1.1.1】基于JdbcPreparedStatement批量更新 【1.2】JdbcTemplate概述【1.2.1】JdbcTemplate类图【1.2.2】使用DataSourceUtils管理Connection【1.2.3】设置Statement参数(控制行为&#xff…

Shopee联盟营销案例对saas行业的启示

在跨境电商的浩瀚海洋中,Shopee以其独特的联盟营销(AMS)策略,为众多品牌商家开辟了新的增长航道。作为深耕SaaS企业渠道分销多年的林叔,我今天想和大家分享一个来自Shopee的成功营销案例,并从中提炼出对Saa…

每日OJ_牛客_抄送列表(切割字符串)

目录 牛客_抄送列表(切割字符串) 解析代码 牛客_抄送列表(切割字符串) 抄送列表__牛客网 解析代码 本题是在第一行的人名中,查找第二行的人名是否存在。牵涉一个全字匹配的问题。步骤: 通过getiine(ci…

HarmonyOS(AIP12 Beta5版)鸿蒙开发:选择条件渲染和显隐控制

开发者可以通过条件渲染或显隐控制两种方式来实现组件在显示和隐藏间的切换。本文从两者原理机制的区别出发,对二者适用场景分别进行说明,实现相应适用场景的示例并给出性能对比数据。 原理机制 条件渲染 if/else条件渲染是ArkUI应用开发框架提供的渲…

软考通过率真的很低吗?

一、软考通过率多少? 首先要说的是,软考办并没有公布过全国考试通过率。但我们可以根据官方公布的报名人数和合格人数做一个预估。 浙江软考办官方公布,浙江2022年下半年软考合格人数为4780人(其中初级779人、中级2392人、高级1609人)。 以…

【附解决方法】由于找不到vcruntime140_1.dll 无法继续执行代码如何处理

准备使用photoshop ,结果弹出这个 提示“由于找不到 VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题。”,这一般是什么原因导致了这个问题,我们要如何解决? 原因: vcruntime140_1.dll文件即动…

【推荐】9款适合中小企业的知识库管理系统

一、什么是知识库管理系统 知识库管理系统(Knowledge Base Management System, KBMS),又称数字资产管理系统(Digital Asset Management System),是专门用于管理企业知识文档、图纸、视频、音频等信息内容的…

中级测试工程师面试题

很多软件测试工程师在面试的时候都会遇到考官给的各种各样的面试题,这也反应了测试工程师对企业的重要性,面试通常分为以下几个方面,由于篇幅有限,在这里就只给大家分享一些比较常见的问题。 一、自我介绍 这里我不分享如何自我介…

FPGA——VGA协议

VGA协议 VGA简介接口及引脚定义显示原理显示电路原理VGA协议电压标准数字信号转化标准模拟信号方案数字信号时序标准 模块设计 VGA简介 VGA,英文全称“Video Graphics Array”,译为视频图形阵列,是一种使用模拟信号进行视频传输的标准协议&a…

观测云广告全国登陆,携手华为云引领企业迈向数智化新纪元

随着数字化转型的浪潮席卷全球,企业如何紧跟时代步伐,实现转型升级,已成为业界热议的焦点。华为云828 B2B企业节,作为业界瞩目的年度盛事,已于8月27日在贵阳盛大开幕。与此同时,观测云与华为云强强联手&…

基于 web教学管理系统设计与实现

3 总体设计 3.1 系统软件体系结构 系统采用B/S结构,统一管理数据库和Web服务器。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构,第一…

沈阳网站建设手机能看的网站

在当今信息化的时代,网站已经成为企业展示形象、推广产品和服务的重要工具。尤其是在中国的沈阳,随着智能手机的普及,越来越多的用户选择通过移动设备浏览网站。因此,建设一个能够在手机上良好展示的网站显得尤为重要。本文将探讨…

vivado中定点类型Binary point的含义

vivado中,ILA或仿真波形显示的定点数,可以设置为有符号或无符号数,其中小数点位置通过Binary point设置,这个设置的数值,表示小数点后的二进制位数 参考: https://people-ece.vse.gmu.edu/coursewebpages/E…

【pandas2】表格数据的行列操作、查询指定的数据内容、数据类型处理、 缺失值处理和透视表、分组与聚合、数据的纵向合并(扩展数据)、数据的横向合并(连接表)

1 表格数据的行列操作 2 查询指定的数据内容 3 数据类型处理 4 缺失值处理 5 透视表 6 分组与聚合 7 统计NBA夺冠次数 8 数据的纵向合并(扩展数据) 9 数据的横向合并(连接表) 1 表格数据的行列操作 # 增 df[info] 这些车都很好 df[desc] df[Sec_price] * df[Km(W)] df.inser…

深度解读SGM41511电源管理芯片I2C通讯协议REG0B寄存器解释

REG0B 是 SGM41511 的第十二个寄存器 也是最后一个寄存器,地址为 0x0B。这个寄存器包含了只读(R)和可读写(R/W)的位。上电复位值(PORV)为 000101xx,其中 x 表示不确定的初始状态。这…

实时数仓,站上产业潮头

在这场新的数据驱动战场里,谁能更好的对数据进行智能、准确、迅速、高性价比的体系化处理,谁能以更低的成本、更高效的能力构建底层的PaaS、IaaS组件,谁就能在如今的市场竞争中构建更具竞争力的业务模型,成为新的弄潮儿。 对Byt…

C#开发中ImageComboBox控件数据源实时变换

在C#开发中,我们如何将控件的数据源实时变换,当然我们可以在窗口实例化的时候指定固定的数据源,但是这样对于用户来说数据源永远固定,并不利于我们对于用户的数据存储,优化用户的操作,遇到这种问题&#xf…

模拟登录页,华为账号一键登录

一、介绍 基于鸿蒙Next模拟账号一键登录,免去账号注册环节二、场景需求 1. 用户场景 新用户: 需要快速注册并登录,以体验华为的服务。 老用户: 希望快速登录,不用每次输入用户名和密码。 2. 界面设计 Logo和标题&#…

RK方案有时一开机要设置GPIO口点平

有时候RK方案,需要一开机就设置GPIO口电平,需要在uboot阶段,board.c #define GPIO_BANK0 0 #define GPIO_BANK1 32 #define GPIO_BANK2 64 #define GPIO_BANK3 …