aosp13/14命令行进入分屏相关实战

背景:

分屏一般在手机上都是都是从桌面的最近任务卡片进入的,一般来说手机用户都是这样操作的,但是有一些场景或者情况就不一定可以顺利用上这个桌面的多任务卡片进入。
比如以下场景:
1、可能不是桌面的多任务的场景,因为桌面进入相对来说流程较多选着较多,有的场景可能想要一键直接进入

2、有可能没有aosp的手机桌面,设备可能是车机,广告机等其他设备,这个时候不一定用的就是手机的桌面

3、经常开发有的可能需要使用命令进行调试等,或者自动化测试等

这个时候就需要有一个可以直接通过命令行拉起分屏的需求是最好的

相关命令

进入分屏相关的命令相关稳定性较差,基本上属于经常会变化情况,所以大家一定要注意查看最新的,具体查看方式可以看如下:
基于aosp13 r6版本命令:

help命令

相关命令一般都是基于WMShell下面进行的具体先看看WMShell命令支持哪些命令,这个需要输入help

test@test:~/disk2/aosp14$ adb shell dumpsys activity service SystemUIService  WMShell help
SERVICE com.android.systemui/.SystemUIService 71a3e0e pid=752 user=0Client:com.android.systemui.wmshell.WMShell:----------------------------------------------------------------------------Window Manager Shell commands:helpPrint this help text.<no arguments provided>Dump Window Manager Shell internal statepair <taskId1> <taskId2>unpair <taskId>Pairs/unpairs tasks with given ids.moveToSideStage <taskId> <SideStagePosition>Move a task with given id in split-screen mode.removeFromSideStage <taskId>Remove a task with given id in split-screen mode.setSideStageOutline <true/false>Enable/Disable outline on the side-stage.setSideStagePosition <SideStagePosition>Sets the position of the side-stage.Dump took 0ms
pair命令

这里可以看到支持pair,moveToSideStage这两个核心的部分,具体这里进行解释一下:
pair
代表成对显示的意识,即吧taskId1和taskId2进行成对显示,即分屏,但是这个分屏和桌面进入的分屏是不一样的,核心不一样的点就是层级结构树都不一样,具体看如下实战。
第一步:
打开两个可以分屏的应用,然后通过命令查看task1和task2的id

test@test:~/disk2/aosp14$ adb shell am stack list
RootTask id=234 bounds=[0,0][1440,2960] displayId=0 userId=0configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}taskId=234: com.android.dialer/com.android.dialer.main.impl.MainActivity bounds=[0,0][1440,2960] userId=0 visible=true topActivity=ComponentInfo{com.android.dialer/com.android.dialer.main.impl.MainActivity}RootTask id=1 bounds=[0,0][1440,2960] displayId=0 userId=0configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}taskId=232: com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher bounds=[0,0][1440,2960] userId=0 visible=false topActivity=ComponentInfo{com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}RootTask id=233 bounds=[0,0][1440,2960] displayId=0 userId=0configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}taskId=233: com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity bounds=[0,0][1440,2960] userId=0 visible=false topActivity=ComponentInfo{com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity}RootTask id=2 bounds=[0,0][1440,2960] displayId=0 userId=0configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}taskId=2: unknown bounds=[0,0][1440,2960] userId=0 visible=falseRootTask id=3 bounds=[0,0][1440,2960] displayId=0 userId=0configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}taskId=4: unknown bounds=[0,0][1440,2960] userId=0 visible=falsetaskId=5: unknown bounds=[0,0][1440,2960] userId=0 visible=false

可以看到这里的 短信taskId是233 电话的taskId是234
执行如下命令:

 adb shell dumpsys activity service SystemUIService  WMShell pair 233 234

看看现象:
在这里插入图片描述
看着是不是和桌面进入分屏一样,但是操作还有有一些区别:
1、分割线双击无法互换上下两个分屏
2、分割线拖拉没有对应屏幕的icon,有黑屏产生
3、对应的层级结构树不一样差异如下:
pair模式进入分屏,发现只有一个task1和task2居然直接挂载同一个父节点
在这里插入图片描述
桌面正常分屏模式
在这里插入图片描述

相当于多了一层挂载点哈,task1和task2有自己main和side 容器task

ps:注意一下版本差异,新版本已经没有了这个命令

moveToSideStage命令
  moveToSideStage <taskId> <SideStagePosition>

明显可以看出这个代表移动taskId到分屏的sideStagePosition,注意了,这个命令只需要指定一个taskId和他的position既可以,那么这里大家会有疑问那么另一个分屏该显示谁?
哈哈,这个其实没有指定当然就没办法按照你想要的task显示,这里系统源码展现的规则是:
当前task层级结构树的最顶部符合分屏要求的task,一般就是最顶端的task

具体使用:
查看短信taskid

  taskId=236: com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity bounds=[0,0][1440,2960] userId=0 visible=false topActivity=ComponentInfo{com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity}

然后把短信放到分屏上部分即0,下部分1

adb shell dumpsys activity service SystemUIService  WMShell moveToSideStage 236 0

这里看看现象:
在这里插入图片描述

分屏另一个显示电话app,但是一定电话么?当然不是,如果我们打开相册情况下,执行命令那么下部分就是相册
在这里插入图片描述
可以看出来又变成图库在下面了,所以这个命令其实不太灵活,没办法准确启动分屏两个task具体显示什么。

ps:高版本这个moveToSideStage命令还有使用差异
aosp14版本如下:
adb shell dumpsys activity service SystemUIService WMShell help

SERVICE com.android.systemui/.SystemUIService 494dc62 pid=736 user=0Client:com.android.systemui.wmshell.WMShell:----------------------------------------------------------------------------Window Manager Shell commands:compatuirestartDialogEnabled [0|false|1|true]Enable/Disable the restart education dialog for Size Compat ModereachabilityEducationEnabled [0|false|1|true]Enable/Disable the restart education dialog for letterbox reachabilityDisable the restart education dialog for letterbox reachabilityprotologstatusGet current ProtoLog status.startStart proto logging.stopStop proto logging and flush to file.enable [group...]Enable proto logging for given groups.disable [group...]Disable proto logging for given groups.enable-text [group...]Enable logcat logging for given groups.disable-text [group...]Disable logcat logging for given groups.save-for-bugreportFlush proto logging to file, only if it's enabled.splitscreenmoveToSideStage <taskId> <SideStagePosition>Move a task with given id in split-screen mode.removeFromSideStage <taskId>Remove a task with given id in split-screen mode.setSideStagePosition <SideStagePosition>Sets the position of the side-stage.transitionstracingstartStart tracing the transitions.stopStop tracing the transitions.save-for-bugreportFlush in memory transition trace to file.helpPrint this help text.<no arguments provided>Dump all Window Manager Shell internal state

明显可以看到多个参数splitsreen,而且也没有pair命令

所以使用需要变成如下
adb shell dumpsys activity service SystemUIService WMShell splitscreen moveToSideStage 585 0

扩展一个startTask命令(代码只针对相关课程学员开源)

针对上面moveToSideStage无法确定另一个分屏的task情况,这里自己补充了startTask,使用方式如下:
adb shell dumpsys activity service SystemUIService WMShell splitscreen startTask taskId1 position1 taskId2 position2

具体实战使用如下:
taskId查看

taskId=590: com.android.dialer/com.android.dialer.main.impl.MainActivity
taskId=589: com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity

有了taskId就可以执行了

adb shell dumpsys activity service SystemUIService WMShell splitscreen startTask  589 0 590 1

在这里插入图片描述

本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单向链表的实现

前言&#xff1a;继顺序表后的又一个线性结构——链表&#xff0c;这里将单向链表的实现。 目录 链表简介: 多文件实现&#xff1a; SList.h&#xff1a; SList.c实现函数的详解&#xff1a; 因为插入数据需要创建节点&#xff0c;很频繁&#xff0c;所以直接将创建新节点分…

ArcGIS Pro 3D建模简明教程

在本文中&#xff0c;我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互&#xff08;即使是专门用于 3D 建模的软件&#xff09;&#xff0c;并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段&#xff1a;…

【免费领取源码】可直接复用的医院管理系统!

今天给大家分享一套基于SpringbootVue的医院管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文中自取) 系统运行图&#xff08;设计报告和接口文档&#xff09; 1、后台管理页面 2、排班管理页面 3、设计报告包含接口文档 源码免费领取方式 后台私信…

Mac版2024 CleanMyMac X 4.15.2 核心功能详解 cleanmymac这个软件怎么样?cleanmymac到底好不好用?

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)

【k8s】&#xff1a;深入理解 Kubernetes 中的污点&#xff08;Taints&#xff09;与容忍度&#xff08;Tolerations&#xff09; 1、污点&#xff08;Taints&#xff09;2、容忍度&#xff08;Tolerations&#xff09;3、示例演示-测试污点的具体应用场景3.1 给节点打污点&…

Zabbix监控Windows

1.在虚拟机中安装zabbix 安装系统一直托不进虚拟机中&#xff1b;因为没安装Tools组件 点击虚拟机&#xff0c;选择安装VMware Tools 2.配置zabbix

整数运算超越存储单元表示范围:上溢出、下溢出、回绕

示例&#xff1a; /*** brief how about integer-underflow-overflow? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <std…

AndroidAutomotive模块介绍(一)整体介绍

前言 Android Automotive 是一个基本 Android 平台&#xff0c;可运行 IVI 系统中预安装的 Android 应用以及可选的第二方和第三方 Android 应用。 本系列文档将会系统的介绍 Android Automotive 的功能、架构、逻辑等。模块逻辑将从 应用api接口、系统服务、底层服务&#x…

【数据结构与算法】之双向链表及其实现!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1、双向链表的结构及概念 2、双向链表的实现 2.1 要实现的接口…

spring高级篇(一)

1、ApplicationContext与BeanFactory BeanFactory是ApplicationContext的父级接口&#xff1a;&#xff08;citlaltu查看类关系图&#xff09; 在springboot的启动类中&#xff0c;我们通过SpringApplication.run方法拿到的是继承了ApplicationContext的ConfigurableApplicatio…

PyCharm 2024.1 发布:全面升级,助力高效编程!

PyCharm 2024.1 发布&#xff1a;全面升级&#xff0c;助力高效编程&#xff01; 文章目录 PyCharm 2024.1 发布&#xff1a;全面升级&#xff0c;助力高效编程&#xff01;摘要引言 Hugging Face&#xff1a;模型和数据集的快速文档预览针对 JavaScript 和 TypeScript 的全行代…

深度学习-多尺度训练的介绍与应用

一、引言 在当今快速发展的人工智能领域&#xff0c;多尺度训练已经成为了一种至关重要的技术&#xff0c;特别是在处理具有复杂结构和不同尺度特征的数据时。这种技术在许多应用中发挥着关键作用&#xff0c;例如图像识别、自然语言处理和视频分析等。 多尺度训练的定义 多尺…

软考 - 系统架构设计师 - 嵌入式真题

问题 1&#xff1a; &#xff08;1&#xff09;.HTML 静态化&#xff1a;可以实现对系统经常访问的页面进行静态化以提高系统访问的效率&#xff0c;但系统页面通常需要数据库中的用户信息和用户选择来动态显示&#xff0c;因此不适合采用。 HTML 静态化&#xff1a; 将动态生成…

Python爬虫:requests模块的基本使用

学习目标&#xff1a; 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…

第23次修改了可删除可持久保存的前端html备忘录:增加了百度引擎

第22次修改了可删除可持久保存的前端html备忘录视频背景分离&#xff0c;增加了本地连接&#xff0c;增加了纯CSS做的折叠隐藏修改说明 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport…

WPF中DataGrid主从数据(父子数据)展示

在wpf中可以使用DataGrid控件,进行主从数据展示,也称父子数据展示。下面展示纯原生控件编码实现功能(样式自己可以根据需求进行修改)。 效果如下: 点击图标,展开和收缩可以自由的切换,也可以自己重新写一个样式,比如+,-或者类似图标的样式,都是可以的。 1.首先创建一…

【光伏企业】光伏项目怎么做才能提高效率?

一、精细化项目管理 项目规划&#xff1a;在项目启动前&#xff0c;进行充分的调研和规划&#xff0c;明确项目的目标、规模、预算和时间表&#xff0c;确保各项资源得到合理分配。 团队建设&#xff1a;组建一支高效、专业的项目团队&#xff0c;确保团队成员具备光伏领域的…

计算机视觉——图像特征提取D2D先描述后检测特征提取算法原理

概述 局部特征提取是计算机视觉中的一个重要任务&#xff0c;它旨在从图像中提取出能够代表图像局部结构和外观信息的特征。这些特征通常用于图像匹配、物体识别、三维重建、跟踪和许多其他应用。传统方法&#xff0c;如尺度不变特征变换&#xff08;SIFT&#xff09;&#xf…

浅谈Java JVM

Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;是Java语言的核心组成部分&#xff0c;它是一个抽象的计算机&#xff0c;负责执行Java字节码指令。JVM是Java平台无关性的基石&#xff0c;它为Java代码提供了一个标准的运行环境&#xff0c;使Java…

【C/C++笔试练习】read函数、虚拟存储、用户态、线程特点、缺页处理、调度算法、进程优先级、锁的使用、创建进程、不用加减乘除做加法、三角形

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;read函数&#xff08;2&#xff09;虚拟存储&#xff08;3&#xff09;用户态&#xff08;4&#xff09;线程特点&#xff08;5&#xff09;缺页处理&#xff08;6&#xff09;调度算法&#xff08;7&#xff09;进程优先…