news 2026/7/1 13:08:24

新版负一屏变天了!分享pixel新桌面负一屏技术调研报告

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
新版负一屏变天了!分享pixel新桌面负一屏技术调研报告

背景

有学员反馈说新版本的pixel负一屏的方案已经不是采用以前的Overlay那种独立Window方式,而是使用的独立的Activity方式,针对学员提出的这个疑问,马哥这边也下载了一个pixel的模拟器进行调研pixel的新版本负一屏方案原理。

直观认识:

主桌面

负一屏

拖动中间时候

调研原理部分

层级结构树部分

使用dumpsys activity containers和sf等查看负一屏情况

DefaultTaskDisplayAreatype=undefinedmode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]│ ├─Task=1type=HOMEmode=fullscreen override-mode=fullscreen requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]│ │ └─Task=3type=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]│ │ ├─ ActivityRecord{6892885u0 com.google.android.apps.nexuslauncher/.NexusLauncherActivity t3}type=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]│ │ │ └─ 6a55d8e com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivitytype=HOMEmode=fullscreen override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]│ │ └─ TaskFragment{b923527mode=multi-window}type=HOMEmode=MULTI-WINDOW override-mode=MULTI-WINDOW requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]│ │ └─ ActivityRecord{184635947u0 com.google.android.googlequicksearchbox/com.google.android.apps.search.googleapp.launcher.minusone.activity.MinusOneActivity t3}type=HOMEmode=MULTI-WINDOW override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]│ │ └─ e843f4 com.google.android.googlequicksearchbox/com.google.android.apps.search.googleapp.launcher.minusone.activity.MinusOneActivitytype=HOMEmode=MULTI-WINDOW override-mode=undefined requested-bounds=[0,0][0,0]bounds=[0,0][2076,2152]

上面的相比正常的多了一个 TaskFragment{b923527 mode=multi-window}的容器,这个是专门装载负一屏的task。

关键属性

  • TaskFragment 以WINDOWING_MODE_MULTI_WINDOW创建,与 fullscreen 的 Launcher Activity 共存于同一 Task
  • TaskFragment 的organizerUid=10195(com.google.android.apps.nexuslauncher),由 Launcher 控制
  • MinusOneActivity 进程为com.google.android.googlequicksearchbox:googleapp(uid=10161),与 Launcher不同进程

activity的生命周期部分

桌面滑动到负一屏

桌面滑动到负一屏时候,桌面首先就已经Pasue了,然后负一屏进行resume,彻底滑到负一屏后,桌面进行stop。

负一屏滑动回桌面

可以看到桌面先调研onStart,松手后滑到桌面才是resume,然后负一屏的activity就进行stop。

三种状态与生命周期

1 CLOSED 状态
  • TaskFragment 存在但setHidden=true
  • MinusOneActivity 未启动(或已 stopped)
  • Launcher 独占显示
2 OPEN 状态
  • TaskFragmentsetHidden=false, MinusOneActivity RESUMED
  • Launcher Window 仍 VISIBLE 但在 WMS 中mObscured=true(被 TF 遮挡)
  • Launcher Activity 状态为 PAUSED
  • MinusOneActivity 为mFocusedWindow
3 MID-DRAG 状态(实验验证)

以下数据来自拖动到中间位置时的实际 dumpsys 实验:

WMS 层面 (dumpsys window)
属性Launcher (Window #9)MinusOne (Window #8)
mViewVisibility0x0 (VISIBLE)0x0 (VISIBLE)
mHasSurfacetruetrue
mObscuredtruefalse
mWindowingModefullscreenmulti-window
SurfaceVRI-NexusLauncherActivity#721VRI-MinusOneActivity#758

关键发现:拖动期间 MinusOne 的 WindowmViewVisibility=0x0 (VISIBLE)mHasSurface=true。这与 OPEN 状态一致,说明 MinusOne 的 Window 在整个拖动过程中保持可见。

Activity 层面 (dumpsys activity)
Task{68ab20d #3 type=home} ├─ topResumedActivity = MinusOneActivity ← ★ 负一屏是 resumed ├─ TaskFragment{b923527 mode=multi-window} │ └─ MinusOneActivity: state=RESUMED │ mWindowingMode=multi-window └─ NexusLauncherActivity: state=PAUSED mWindowingMode=fullscreen

关键发现:拖动过程中 MinusOneActivity 已经处于RESUMED状态,Launcher 处于PAUSED。说明一旦开始拖动(ACTION_DOWN),系统就已经完成了 Activity 生命周期的切换。用户拖动的是"已经 RESUME 的 MinusOneActivity 的 Surface 的位置",而不是在拖动过程中做 Activity 切换。

总结部分

Pixel Launcher 的负一屏不是在 Launcher 进程内嵌入一个 View 或 Fragment,而是利用 Android 12+ 的TaskFragment API,在 Launcher 的 Task 内创建一个独立的TaskFragment,将 Google App (Velvet) 的MinusOneActivitymulti-window模式嵌入其中。

两个 Activity 拥有各自独立的 Window 和 Surface,在 SurfaceFlinger 层面通过 z-order 叠加显示,通过两种不同的偏移机制实现同步滑动:

偏移目标机制层级
Launcher (NexusLauncherActivity)View.setTranslationX()View 层
负一屏 (MinusOneActivity)SurfaceControl.Transaction.setMatrix()Surface 层

上面就是马哥对于新版本负一屏的初步调研方案,后续有时间会进行模仿pixel实现新版本负一屏的demo,欢迎相关vip学员找马哥交流实现方案等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 13:08:00

双极电凝镊有粉和无粉怎么选

“有粉”与“无粉”双极电凝镊的核心区别在于镊尖是否带有防粘连涂层。有粉镊通过表面处理减少组织焦痂的附着,使电凝更顺畅;无粉镊则完全依赖金属基材,成本更低但术中更容易粘连。医院选购时,并非单纯追求“有粉就是好”&#xf…

作者头像 李华
网站建设 2026/7/1 13:07:07

嵌入式系统精确计时方案:CS2200-CP与PIC18F87J10实战

1. 为什么需要精确计时?在嵌入式系统开发中,精确计时就像交响乐团的指挥家,它协调着各个硬件模块的运作节奏。我曾在工业自动化项目中遇到过这样的场景:一个简单的计时误差导致整个生产线同步错乱,造成了价值数十万的废…

作者头像 李华
网站建设 2026/7/1 13:04:37

【深度】从亏400亿到单季赚1900亿——海力士如何靠AI翻盘?

$294亿SK海力士ADR追平沙特阿美——史上最大ADR,AI时代的顶点信号?第一层:294亿是什么量级,凭什么是海力士?SK海力士7月10号ADR在纳斯达克开始交易,7月29号正式挂牌,募资294亿美金。ADR让美国投…

作者头像 李华
网站建设 2026/7/1 13:04:05

K8s 自定义资源:用声明式 API 简化平台工程

K8s 自定义资源:用声明式 API 简化平台工程一、原生资源的局限与平台扩展需求 Kubernetes 提供了 Deployment、Service、ConfigMap 等内置资源,能处理无状态服务、配置管理等通用场景。但当团队用 K8s 搭建业务平台时,会发现原生资源的抽象层…

作者头像 李华
网站建设 2026/7/1 13:03:44

B站成分检测器终极指南:如何快速识别评论区用户真实身份

B站成分检测器终极指南:如何快速识别评论区用户真实身份 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker 在…

作者头像 李华
网站建设 2026/7/1 13:03:28

6DoF运动跟踪技术:从传感器到嵌入式实现的全面解析

1. 从3D到6DoF:运动跟踪的技术跃迁在嵌入式传感器领域,IIM-42652与PIC18LF45K22的组合堪称微型运动跟踪系统的黄金搭档。这个方案最吸引人的地方在于:用消费级硬件的成本,实现了工业级运动数据采集的精度。去年我在开发无人机飞控…

作者头像 李华