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…...
探索汽车LAR LQG半主动/主动悬架:基于Simulink的奇妙之旅
汽车lar lqg 半主动/主动悬架 simulink在汽车工程领域,悬架系统犹如车辆的“脚”,直接影响着行驶的平顺性和安全性。今天咱们就来唠唠汽车的LAR LQG半主动/主动悬架,顺便用Simulink来比划比划。 LAR LQG悬架原理简述 LAR(Linear …...
别再乱选格式了!LVGL图片转换工具(lv_img_conv)保姆级使用指南,从BMP到C数组一次搞定
LVGL图像转换实战指南:从格式选择到批量处理的完整解决方案 在嵌入式UI开发中,图像资源处理往往是第一个技术门槛。许多开发者在使用LVGL时,80%的初期问题都集中在图像转换环节——为什么转换后的图片显示异常?如何平衡内存占用和…...
LeetCode 删除无效的括号:python 题解
简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...
3分钟掌握:如何在Windows上直接安装Android应用的终极方案
3分钟掌握:如何在Windows上直接安装Android应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过这样的情况:手机上有…...
保姆级教程:在Ubuntu 20.04上搞定Ollama WebUI可视化界面(含Node.js 18.19.0安装避坑)
零基础在Ubuntu 20.04上部署Ollama WebUI全攻略 第一次在Linux服务器上部署Web应用?别担心,这篇教程会像老朋友一样手把手带你完成整个流程。我们将从最基础的环境检查开始,一步步安装Node.js、配置ollama-webui,直到最终在浏览器…...
Python 学习笔记:学习路线图规划
1989 年的圣诞节期间,时任荷兰数学和计算机科学研究学会(CWI)研究员的 Guido van Rossum[1] 决定基于 ABC 语言设计并实现一门新的脚本编程语言,最初目的是用于替代 Unix shell 和部分 C 程序,以承担 Amoeba 分布式操作…...
别再让设备突然罢工!手把手教你用MATLAB搞预测性维护(附往复泵故障诊断实战)
别再让设备突然罢工!手把手教你用MATLAB搞预测性维护(附往复泵故障诊断实战) 设备突然停机造成的损失有多严重?某化工厂曾因关键泵组突发故障导致全线停产36小时,直接经济损失超过200万元。这种场景在工业领域并不罕见…...
三步实现电脑玩手游:QtScrcpy让你的手机秒变游戏主机
三步实现电脑玩手游:QtScrcpy让你的手机秒变游戏主机 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...
FastAPI 2.0流式响应性能翻倍的4个隐藏配置:uvloop优化、httpx异步客户端复用、response_model_exclude_unset调优、asyncpg连接池预热
第一章:FastAPI 2.0流式响应性能翻倍的全景认知FastAPI 2.0 引入了原生异步流式响应(StreamingResponse)的底层重构,通过移除中间层缓冲、直接对接 ASGI 服务器的 send 协议,并支持零拷贝字节流分块推送,显…...
点云特征提取入门:5分钟搞懂Voxel-based和Pillar-based的核心区别
点云特征提取入门:5分钟搞懂Voxel-based和Pillar-based的核心区别 想象一下,当你站在城市的高楼俯瞰街道,看到的车辆和行人就像散落在空间中的点。这些点如何被计算机"理解"?这就是点云特征提取要解决的问题。Voxel-bas…...
