Android 16系统源码_自由窗口(一)触发自由窗口模式

news2025/7/23 6:21:18

前言

从 Android 7.0 开始,Google 推出了一个名为“多窗口模式”的新功能,允许在设备屏幕上同时显示多个应用,多窗口模式允许多个应用同时共享同一屏幕,多窗口模式(Multi Window Supports)目前支持以下三种配置:

分屏模式:让系统可以左右或上下并排显示应用。

画中画模式:在应用中用小窗口叠加显示其他应用

自由窗口模式:在可移动且可调整大小的单独窗口中显示各个应用。

本系列文章我们主要来分析一下自由窗口模式相关的知识点。

通过最近任务进入自由窗口模式

打开Activity,然后进入最近任务触发自由窗口,可以成功进入自由窗口模式,具体可以参考下图。最近任务进入自由窗口
默认情况下在最近任务列表中点击应用图标,弹出的菜单列表中是没有自由窗口这个选项的,可以通过以下两种方式开启。

1、进入开发者模式页面进行开关开启
在这里插入图片描述
2、通过adb指令开启

adb shell settings put global force_resizable_activities 1 //强制应用支持自由缩放
adb shell settings put global enable_freeform_support 1 //开启自由窗口功能
adb shell am restart  或者 adb reboot

其实开发者模式页面的两个开关,本质也是修改force_resizable_activities和enable_freeform_support这两个数据库字段。

adb指令进入自由窗口模式

adb shell am start-activity --windowingMode 5 <package/activity>

全屏/自由窗口层级树信息对比

我使用的安卓模拟器屏幕尺寸为1080x2400,通过adb shell dumpsys activity containers指令可以将Activity的层级树信息导出来,这里我们分别导出全屏模式和自由窗口模式下页面层级树的信息,看看二者有什么不同。

全屏模式层级树信息

全屏模式下层级树的DefaultTaskDisplayArea节点信息如下所示。
全屏模式

       #1 DefaultTaskDisplayArea type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
        #3 Task=18 type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
         #0 ActivityRecord{a200ce1 u0 com.example.myapplication/.MainActivity t18} type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
          #0 ac18fc1 com.example.myapplication/com.example.myapplication.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=10 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
          #0 ActivityRecord{918f596 u0 com.android.launcher3/.uioverrides.QuickstepLauncher t10} type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
           #0 c296ee2 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
        #1 Task=8 type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
         #0 ActivityRecord{6fa0b29 u0 com.android.dialer/.main.impl.MainActivity t8} type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
          #0 c7c5ed4 com.android.dialer/com.android.dialer.main.impl.MainActivity type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
        #0 Task=2 type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
         #1 Task=4 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,2400][1080,3600] bounds=[0,2400][1080,3600]
         #0 Task=3 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]

在全屏模式下MainActivity的相关信息如下:

  • 根Task的mode=fullscreen(全屏模式),bounds=[0,0][1080,2400]
  • 父节点ActivityRecord的mode=fullscreen(全屏模式),bounds=[0,0][1080,2400]
  • MainActivity的mode=fullscreen(全屏模式),bounds=[0,0][1080,2400]

自由窗口模式层级树信息

自由窗口模式下层级树的DefaultTaskDisplayArea节点信息如下所示。
自由窗口

       #1 DefaultTaskDisplayArea type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
        #3 Task=18 type=standard mode=freeform override-mode=freeform requested-bounds=[50,113][590,1313] bounds=[50,113][627,1313]
         #0 ActivityRecord{a200ce1 u0 com.example.myapplication/.MainActivity t18} type=standard mode=freeform override-mode=undefined requested-bounds=[0,0][0,0] bounds=[50,113][627,1313]
          #0 62f1d77 com.example.myapplication/com.example.myapplication.MainActivity type=standard mode=freeform override-mode=undefined requested-bounds=[0,0][0,0] bounds=[50,113][627,1313]
        #2 Task=1 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
         #0 Task=10 type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
          #0 ActivityRecord{918f596 u0 com.android.launcher3/.uioverrides.QuickstepLauncher t10} type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
           #0 c296ee2 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher type=home mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
        #1 Task=8 type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
         #0 ActivityRecord{6fa0b29 u0 com.android.dialer/.main.impl.MainActivity t8} type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
          #0 c7c5ed4 com.android.dialer/com.android.dialer.main.impl.MainActivity type=standard mode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
        #0 Task=2 type=undefined mode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]
         #1 Task=4 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,2400][1080,3600] bounds=[0,2400][1080,3600]
         #0 Task=3 type=undefined mode=multi-window override-mode=multi-window requested-bounds=[0,0][0,0] bounds=[0,0][1080,2400]

在自由窗口模式下MainActivity的相关信息如下:

  • 根Task的mode=freeform(自由模式),bounds=[50,113][627,1313]
  • 父节点ActivityRecord的mode=freeform(自由模式),bounds=[50,113][627,1313]
  • MainActivity的mode=freeform(全屏模式),bounds=[50,113][627,1313]

自由窗口模式SurfaceFlinger信息可见图层信息

Display 4619827259835644672 (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#63
  rel      0 |            0 |     DEVICE |          0 |    0    0 1080 2400 |   21.0   47.0  440.0  977.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 com.android.launcher3/com.android.la[...]3.uioverrides.QuickstepLauncher#1179
  rel      0 |            1 |     DEVICE |          0 |    0    0 1080 2400 |    0.0    0.0 1080.0 2400.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 com.example.myapplication/com.example.myapplication.MainActivity#1192
  rel      0 |            1 |     DEVICE |          0 |   50  113  627 1313 |    0.0    0.0  577.0 1200.0 |                                              [*]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 Caption of Task=42#1199
  rel      0 |            0 |     DEVICE |          0 |   50  113  627  223 |    0.0    0.0  577.0  110.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 StatusBar#80
  rel      0 |         2000 |     DEVICE |          0 |    0    0 1080   63 |    0.0    0.0 1080.0   63.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 NavigationBar0#76
  rel      0 |         2019 |     DEVICE |          0 |    0 2274 1080 2400 |    0.0    0.0 1080.0  126.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
  • Caption of Task=42#1199 自由窗口顶部的菜单栏
    自由窗口菜单栏

总结

经过对比可以发现

  • 当应用Activity处于全屏模式的时候,Activity,父节点ActivityRecord,根Task全部为fullscreen(全屏模式),根Task直接挂载在DefaultTaskDisplayArea节点上。
  • 而当应用Activity处于自由窗口模式的时候,Activity,父节点ActivityRecord,根Task全部为freeform(自由模式),该Task直接挂载在DefaultTaskDisplayArea叶子节点上。
  • 当处于自由模式的时候,系统会为自由窗口添加一个名为Caption of Task的顶部菜单栏视图。

理解了这些,后面我们再结合Android系统任务栈的特性,才能够更好的理解分屏模式框架的实现思路。

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

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

相关文章

sqli-labs第十八关——POST-UA注入

一&#xff1a;判断注入类型 先在用户名和密码框尝试判断&#xff0c;发现都得不到需要的回显 所以查看源码 可以发现username和password的输入后端都做了检查&#xff0c;没法直接注入 所以我们尝试uagent注入 UA注入&#xff1a; 没有url解码处理只识别原始空格&#xff…

mac上安装 Rust 开发环境

1.你可以按照提示在终端中执行以下命令&#xff08;安全、官方支持&#xff09;&#xff1a; curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh然后按提示继续安装即可。 注意&#xff1a;安装过程中建议选择默认配置&#xff08;按 1 即可&#xff09;。 如果遇…

《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》

目录 七. strncpy函数的使用与模拟实现 7.1 strncpy函数理解 7.2 strncpy函数使用示例 7.3 strncpy函数模拟实现 八. strncat函数的使用与模拟实现 8.1 strncat函数理解 8.2 strncat函数使用示例 8.3 strncat函数模拟实现 九. strncmp函数的使用 9.1 strncmp函数理…

百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%

百度飞桨 PaddleOCR 3.0 开源发布 2025 年 5 月 20 日&#xff0c;百度飞桨团队正式发布了 PaddleOCR 3.0 版本&#xff0c;并将其开源。这一新版本在文字识别精度、多语种支持、手写体识别以及高精度文档解析等方面取得了显著进展&#xff0c;进一步提升了 PaddleOCR 在 OCR …

Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用

一、FPGA 在线升级 FPGA 在线升级FLASH时&#xff0c;一般是通过逻辑生成SPI接口操作FLASH&#xff0c;当然也可以通过其他SOC经FPGA操作FLASH&#xff0c;那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA&#xff0c;只有CCLK是专用引脚&#xff0c;SPI接口均为普…

数字孪生驱动的离散制造智能升级:架构设计与工程实践

针对离散制造行业多品种、小批量的生产特性&#xff0c;本文提出一种基于数字孪生的智能制造解决方案。以某国家级智能制造试点示范项目为载体&#xff0c;构建"云-边-端"协同的数字孪生系统&#xff0c;实现设备综合效率&#xff08;OEE&#xff09;提升28.7%、订单…

9.4在 VS Code 中配置 Maven

在 VS Code 中配置 Maven 需要完成 Maven 环境安装 一、安装 Maven&#xff08;如果未安装&#xff09; 下载 Maven 访问 Apache Maven 官网&#xff0c;下载最新版本的 Maven&#xff08;如apache-maven-3.9.9-bin.zip&#xff09;。 解压文件 将下载的 ZIP 文件解压到本地目…

新能源汽车充电桩资源如何利用资源高效配置?

新能源汽车充电桩资源的高效配置是实现绿色交通转型的关键环节。随着新能源汽车保有量的快速增长&#xff0c;充电基础设施的供需矛盾日益凸显。如何优化充电桩资源布局、提升使用效率、平衡不同场景需求&#xff0c;成为当前亟待解决的问题。以下是几点关于充电桩资源高效配置…

LeetCode --- 450周赛

题目列表 3550. 数位和等于下标的最小下标 3551. 数位和排序需要的最小交换次数 3552. 网格传送门旅游 3553. 包含给定路径的最小带权子树 II 一、数位和等于下标的最小下标 直接模拟计算数位和即可&#xff0c;代码如下 // C class Solution { public:int smallestIndex(ve…

SpringBoot中消息转换器的选择

SpringBoot返回xml-CSDN博客 是返回JSON 还是XML 是由内容协商机制确认的,SpringBoot为了开发便利性,如果我没有该消息转换器,默认就返回了JSON,如果需要XML那么,引入 <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>…

基于点标注的弱监督目标检测方法研究

摘要 在计算机视觉领域&#xff0c;目标检测需要大量精准标注数据&#xff0c;但人工标注成本高昂。弱监督目标检测通过低成本标注训练模型&#xff0c;成为近年研究热点。本文提出一种基于点标注的弱监督目标检测算法&#xff0c;仅需在图像中物体中心点标注&#xff0c;即可高…

超越OpenAI CodeX的软件工程智能体:Jules

目前AI编码代理&#xff08;coding agent&#xff09;领域正迅速崛起&#xff0c;Google推出了一款名为Jules的非同步编码代理&#xff08;asynchronous coding agent&#xff09;&#xff0c;主要针对专业开发者&#xff0c;与传统在开发环境中直接辅助编码的Cursor或Windsurf…

轻量化MEC终端 特点

MEC&#xff08;多接入边缘计算&#xff09;解决方案通过将计算能力下沉至网络边缘&#xff0c;结合5G网络特性&#xff0c;已在多个行业实现低延迟、高可靠、高安全的应用部署。以下从技术架构、核心优势及典型场景三方面进行总结&#xff1a; 一、技术架构 分层设计‌ MEC架…

NIST提出新型安全指标:识别潜在被利用漏洞

美国国家标准与技术研究院&#xff08;NIST&#xff09;近日公布了一项突破性的安全指标&#xff0c;旨在评估哪些软件漏洞可能已被利用——即使相关组织尚未察觉。 这项由前NIST专家Peter Mell和网络安全与基础设施安全局&#xff08;CISA&#xff09;Jonathan Spring共同完成…

List介绍

什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法 Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进行遍历的&#xff0c;具体如下&#xff1…

正则表达式全解:一文学会正则表达式【附在线正则表达式练习网站】

1.正则表达式的作用 案例演示 先给大家看一个例子,在以下文本中存储了一些职位信息: Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员 测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员 Python3 …

Nginx-详解(二)

nginx 常见模块 第三方模块是对nginx 的功能扩展&#xff0c;第三方模块需要在编译安装nginx 的时候使用参数-- add-modulePATH指定路径添加&#xff0c;有的模块是由公司的开发人员针对业务需求定制 开发的&#xff0c;有的模块是开源爱好者开发好之后上传到github进行开源的…

MCP、MCPHub、A2A、AG-UI概述

MCP Model Context Protocol&#xff0c;模型上下文协议&#xff0c;Anthropic于2024年开源的标准协议&#xff0c;旨在统一AI模型与数据源的交互方式&#xff0c;提升数据访问的便捷性和可靠性&#xff0c;提供标准化的工具调用、资源管理和提示词功能。 MCP的基本定义&…

[Linux]磁盘分区及swap交换空间

linux磁盘分区 计算机容量单位&#xff1a;一般用B&#xff0c;KB&#xff0c;MB&#xff0c;GB&#xff0c;TB&#xff0c;PB&#xff0c;EB&#xff0c;ZB&#xff0c;YB&#xff0c;BB来表示。 它们之间的关系是&#xff1a; 1KB (Kilobyte 千字节)1024B, 1MB (Megabyte 兆…

Linux常见指令合集+知识点

Linux有一条设计理念&#xff1a;Linux中一切皆文件&#xff1b;这样的设计理念让Linux可以用一种统一的方式对Linux中的不同文件/设备进行管理&#xff1b;&#xff08;也就是键盘、显示器等在Linux中也算文件&#xff09; 文件内容属性&#xff0c;指令一般都是对文件进行操…