Android Activity栈关系解析
在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例:
1. ActivityRecord(活动记录)
-
是什么:代表一个 Activity 实例,存储 Activity 的元数据(如 Intent、启动模式、组件信息等)。
-
职责:
- 跟踪 Activity 的生命周期状态(如
RESUMED、PAUSED)。 - 管理 Activity 的窗口(如界面层级、焦点状态)。
- 跟踪 Activity 的生命周期状态(如
-
示例:
// 当启动 MainActivity 时,系统会创建一个 ActivityRecordIntent intent = new Intent(context, MainActivity.class);startActivity(intent);
2. TaskRecord(任务记录)
-
是什么:代表一个 任务栈,用户视角中的一个“任务”(例如用户从桌面启动一个应用形成的任务)。
-
职责:
- 维护一组按顺序排列的
ActivityRecord(后进先出,LIFO)。 - 处理任务栈的导航逻辑(如返回键回退)。
- 维护一组按顺序排列的
-
关键属性:
taskAffinity:任务栈的“归属标识”,决定 Activity 应归属到哪个任务。rootActivity:任务栈的根 Activity(第一个启动的 Activity)。
-
示例:
- 用户从桌面点击微信图标,启动
MainActivity,生成一个TaskRecord。 - 从
MainActivity跳转到ChatActivity,后者被压入同一任务栈。
- 用户从桌面点击微信图标,启动
3. ActivityStack(活动栈)
-
是什么:管理 一组相关的 TaskRecord,通常对应一个逻辑显示区域(如主屏幕、分屏窗口)。
-
职责:
- 控制 TaskRecord 的可见性和生命周期(如暂停后台栈中的 Activity)。
- 处理栈的焦点状态(如前台栈、后台栈)。
-
类型:
- 应用栈(Application Stack) :普通应用的任务栈。
- Home 栈:桌面和最近任务列表的栈。
- 特殊场景栈:如锁屏栈、语音交互栈。
-
示例:
- 分屏模式下,左侧窗口对应一个
ActivityStack,右侧窗口对应另一个ActivityStack。
- 分屏模式下,左侧窗口对应一个
4. ActivityDisplay(活动显示器)
-
是什么:管理 物理或虚拟显示设备(如手机主屏、外接显示器、分屏窗口)。
-
职责:
- 协调一个屏幕上的所有
ActivityStack。 - 处理多屏交互(如窗口拖拽到另一个屏幕)。
- 协调一个屏幕上的所有
-
示例:
- 手机连接外接显示器时,系统创建两个
ActivityDisplay,分别管理手机和显示器的任务栈。
- 手机连接外接显示器时,系统创建两个
5. ActivityStackSupervisor(活动栈监督者)
-
是什么:全局协调者,管理所有
ActivityDisplay和ActivityStack。 -
职责:
- 处理 Activity 的启动、切换、销毁等核心逻辑。
- 维护当前焦点栈(
mFocusedStack)。 - 处理跨栈操作(如分屏模式下调整栈的层级)。
-
关键行为:
- 根据启动模式(如
singleTask)和 Intent Flags(如FLAG_ACTIVITY_NEW_TASK)决定 Activity 的归属栈。 - 处理返回键逻辑(回退栈顶 Activity)。
- 根据启动模式(如
层级关系总结
实际协作流程示例
场景:用户在分屏模式下,左侧窗口运行微信,右侧窗口运行浏览器。
-
ActivityStackSupervisor 创建两个
ActivityDisplay(逻辑分屏视为两个虚拟屏幕)。 -
左侧
ActivityDisplay创建一个ActivityStack,管理微信的TaskRecord(包含MainActivity和ChatActivity)。 -
右侧
ActivityDisplay创建另一个ActivityStack,管理浏览器的TaskRecord(包含HomePage和ArticlePage)。 -
用户点击微信的返回键:
ActivityStackSupervisor找到左侧ActivityStack的栈顶ActivityRecord(ChatActivity)。- 销毁
ChatActivity,回退到MainActivity。
-
用户拖拽浏览器窗口到左侧屏幕:
ActivityStackSupervisor将浏览器的TaskRecord迁移到左侧ActivityDisplay的ActivityStack。
对开发者的意义
-
调试工具:
-
通过
adb shell dumpsys activity查看完整的栈信息:adb shell dumpsys activity activities -
输出示例:
Display #0 (手机主屏):Stack #0: type=standard, bounds=[0,0][1080,1920]Task #100: affinity=com.wechat, size=2ActivityRecord{MainActivity}ActivityRecord{ChatActivity}
-
-
启动模式与任务栈:
- 使用
launchMode="singleTask"时,系统会查找匹配的TaskRecord,若存在则复用,否则新建。 FLAG_ACTIVITY_NEW_TASK强制在新的TaskRecord中启动 Activity。
- 使用
-
多窗口适配:
- 在分屏/自由窗口模式下,需处理
Configuration变化(如屏幕尺寸、方向)。
- 在分屏/自由窗口模式下,需处理
总结
ActivityRecord 是砖块,TaskRecord 是房间,ActivityStack 是楼层,ActivityDisplay 是整栋楼,ActivityStackSupervisor 是物业总公司。
相关文章:
Android Activity栈关系解析
在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例: 1. ActivityRecord(活动记录) 是什么…...
java使用word模板填充内容,再生成pdf
1.word模板填充内容 使用EasyPoi写入Word文档。 import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File; import java…...
回归实战详细代码+解析:预测新冠感染人数
回归实战:预测新冠感染人数 先回顾下回归是个啥玩意 首先需要一组训练集,说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程,当然人和机器现在都不知道什么计算是什么,这是一个黑箱。 黑箱比喻:把模型想象成自…...
AI人工智能机器学习之聚类分析
1、概要 本篇学习AI人工智能机器学习之聚类分析,以KMeans、AgglomerativeClustering、DBSCAN为例,从代码层面讲述机器学习中的聚类分析。 2、聚类分析 - 简介 聚类分析是一种无监督学习的方法,用于将数据集中的样本划分为不同的组ÿ…...
(下:补充——五个模型的理论基础)深度学习——图像分类篇章
目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构,BN以及迁移学习详解 总结(可以直接看总结) 1.1 卷积神经网络基础 视频讲解…...
使用Python自动生成图文并茂的网页分析报告
在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分…...
uniapp-原生android插件开发摘要
uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写,从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...
GIT工具学习【1】:基本操作
目录 0.本地代码分区1.配置自己的个人信息(设置一次即可)2.新建仓库3.提交代码到暂存区(加入购物车)4.从暂存区撤回(不会改变工作区文件)5.恢复指定版本(会改变工作区文件)5.1&#…...
《国密算法开发实战:从合规落地到性能优化》
前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...
【语法】C++中string类中的两个问题及解答
贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有…...
LeetCode-154. 寻找旋转排序数组中的最小值 II
1、题目描述: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,…...
2.数据结构:1.Tire 字符串统计
1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层,每一层至多 26 个节点(字母) int cnt[N];//字符串至多 N 个ÿ…...
C语言复习4:有关数组的基础常见算法
# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…...
Ubuntu从零创建Hadoop集群
目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...
GPIO概念
GPIO通用输入输出口 在芯片内部存在多个GPIO,每个GPIO用于管理多个芯片进行输入,输出工作 引脚电平 0v ~3.3v,部分引脚可容任5v 输出模式下可控制端口输出高低电平,可以驱动LED,控制蜂鸣器,模拟通信协议&a…...
Node.js, Bun, Deno 比较概述
以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl(Node.js 原作者)Jarred Sumner运行时引擎V8(Chrome)V8(Chrome)JavaScriptCore&#…...
C# 类库打包dll文件
目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…...
Linux中的UDP编程接口基本使用
UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式,有了这些理论基础之后,下面先从UDP编程开始从操作部分深入网络 在本篇中,主要考虑下面的内容: 创建并封装服务端:了解创建服务端的…...
RAG项目实战:金融问答系统
需求痛点 私有知识很多,如何让大模型只选择跟问题有关的知识进行参考呢? 需求分析 是否可以使用关键词匹配呢?以前的搜索主要使用关键词匹配,这个要求太高了,需要提前抽取准备好关键词,有点像以前SEO的工…...
大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化
假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解,接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化,以下是详细介绍及代码示例: 1. React 高级特性的深入学习 1.1 React 并发模式(Con…...
保姆级教程:在Vue3项目中用ZLMediaKit+WebRTC实现超低延迟监控直播(附完整代码)
Vue3WebRTC超低延迟监控直播实战指南 在实时视频监控领域,延迟是衡量系统性能的核心指标之一。传统RTSP流媒体方案在Web端实现时,往往面临秒级甚至更长的延迟,这在对实时性要求极高的安防监控、工业检测等场景中成为致命短板。本文将深入探讨…...
零基础掌握罗技鼠标宏:让你的PUBG压枪更稳定
零基础掌握罗技鼠标宏:让你的PUBG压枪更稳定 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中难以控制的武器后坐…...
如何永久免费激活Windows和Office?KMS_VL_ALL_AIO智能激活脚本完整指南
如何永久免费激活Windows和Office?KMS_VL_ALL_AIO智能激活脚本完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活弹窗烦恼吗?是否遇到过Office突…...
3步掌握抖音批量下载:终极免费无水印下载器完整指南
3步掌握抖音批量下载:终极免费无水印下载器完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...
seaborn实践
本文章基于豆包整理了使用seaborn生成若干典型图表的示例代码,可供学习seaborn使用。一、图表结果预览二、测试数据生成生成了两组数据,一组是银行贷款存款数据,一组是学生成绩数据,生成数据代码如下:-- 1. 创建数据库…...
Logisim-evolution数字电路设计实战:从图形化设计到FPGA实现的完整工作流
Logisim-evolution数字电路设计实战:从图形化设计到FPGA实现的完整工作流 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution Logisim-evolution作为一款功能强大…...
嵌入式开发通用工具包设计:提升效率与代码质量的核心架构
1. 项目概述:为什么嵌入式开发需要一个“工具箱”?干了十几年嵌入式,从8位单片机玩到多核ARM Cortex-A,我最大的感受就是:重复造轮子和调试效率低下是拖慢项目进度的两大元凶。每次新项目启动,都得重新搭建…...
DDD 中的代码组织:按技术层分 vs 按领域模块分,哪种才是正解?
前言 在实践领域驱动设计(DDD)时,你可能见过两种截然不同的代码组织方式:一种是传统的按技术层划分文件夹,另一种是按业务模块划分文件夹。两种写法的人都声称自己在做 DDD,那到底哪种更合理?本…...
警惕AI领域虚构技术名词:Mythos等未证实概念辨析
我不能按照您的要求生成关于“TAI #200: Anthropic’s Mythos Capability Step Change and Gated Release”的博文内容。原因如下:该标题涉及未经公开验证的虚构/推测性信息:截至目前(2024年中),Anthropic 官方未发布任…...
CW-DAPLINK调试器开箱体验:从拆包到点亮第一个LED灯的全过程
CW-DAPLINK调试器开箱体验:从拆包到点亮第一个LED灯的全过程 拆开快递包装的那一刻,看到印有CW-DAPLINK字样的白色小盒子,作为嵌入式开发新手的我既兴奋又忐忑。这款由武汉芯源半导体推出的调试工具,将成为我探索CW32系列MCU世界的…...
