Android 第5种启动模式:singleInstancePerTask

news2024/11/26 0:42:49

Android 第5种启动模式:singleInstancePerTask

随着 Android 版本的更新,应用启动模式逐渐丰富。在 Android 12 中,新增了一种启动模式——singleInstancePerTask。它是继 standardsingleTopsingleTasksingleInstance 之后的第五种启动模式。本文将详细介绍 singleInstancePerTask 的工作原理、使用场景以及与其他启动模式的区别。

一、什么是 singleInstancePerTask?

singleInstancePerTask 允许一个 Activity 作为任务栈的根 Activity 来运行,并且它只会在这个任务栈中有一个实例。不过,与 singleTask 不同的是,singleInstancePerTask 可以在不同的任务栈中创建多个实例。如果启动该 Activity 时设置了 FLAG_ACTIVITY_MULTIPLE_TASKFLAG_ACTIVITY_NEW_DOCUMENT 标志,那么每次启动时都会创建新的任务栈。

在 Android SDK 中,singleInstancePerTask 的定义如下:

<!-- Activity can only be running as the root activity of the task, and therefore
     there will only be one instance of this activity in a task. However, unlike
     singleTask, this activity can be started in multiple instances in different tasks. -->
<enum name="singleInstancePerTask" value="4" />

通过此定义可以看出,singleInstancePerTask 可以避免在同一个任务栈中创建多个实例,但允许在不同的任务栈中有多个实例。而 singleTask 则会限制该 Activity 只存在于一个任务栈中。

二、singleInstancePerTask 的使用场景

为了更好地理解 singleInstancePerTask,我们可以通过实际测试来查看任务栈的状态。假设我们有如下的几个 Activity:

  1. MainActivity:标准启动模式 standard
  2. SingleInstancePerTaskActivitysingleInstancePerTask 启动模式。
  3. StandardActivity:标准启动模式 standard

示例一:MainActivity 启动 SingleInstancePerTaskActivity

MainActivity 启动 SingleInstancePerTaskActivity 后,可以通过 adb shell dumpsys activity activities | grep <package_name> 查看任务栈状态。输出如下:

Task{e1d436a #18 type=standard A=10147:com.example.app U=0 visible=false sz=1}
* ActivityRecord{35a6661 u0 com.example.app/.MainActivity t18}
Task{81c692c #19 type=standard A=10147:com.example.app U=0 visible=true sz=1}
* ActivityRecord{d0488df u0 com.example.app/.SingleInstancePerTaskActivity t19}

可以看到,此时有两个任务栈:MainActivity 所属的任务栈和 SingleInstancePerTaskActivity 所创建的新任务栈。

示例二:从 SingleInstancePerTaskActivity 启动 StandardActivity

接下来我们在 SingleInstancePerTaskActivity 中启动 StandardActivity,此时查看任务栈状态:

Task{81c692c #19 type=standard A=10147:com.example.app U=0 visible=true sz=2}
* ActivityRecord{455ff31 u0 com.example.app/.StandardActivity t19}
* ActivityRecord{d0488df u0 com.example.app/.SingleInstancePerTaskActivity t19}

可以看到 StandardActivitySingleInstancePerTaskActivity 位于同一个任务栈中,而不会创建新的任务栈。

示例三:从 StandardActivity 再次启动 SingleInstancePerTaskActivity

这时再从 StandardActivity 启动 SingleInstancePerTaskActivity,查看任务栈状态:

Task{81c692c #19 type=standard A=10147:com.example.app U=0 visible=true sz=1}
* ActivityRecord{d0488df u0 com.example.app/.SingleInstancePerTaskActivity t19}

此时 SingleInstancePerTaskActivity 并不会重新创建,而是通过 onNewIntent() 方法复用已有实例,同时 StandardActivity 被销毁。这样的行为类似于 singleTask 的处理方式。

三、搭配 Intent.FLAG_ACTIVITY_MULTIPLE_TASK 使用

singleInstancePerTask 还可以与 Intent.FLAG_ACTIVITY_MULTIPLE_TASKIntent.FLAG_ACTIVITY_NEW_DOCUMENT 配合使用,允许在不同任务栈中启动多个实例。例如,以下代码启动 SingleInstancePerTaskActivity 并创建新任务栈:

Intent intent = new Intent(this, SingleInstancePerTaskActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);

此时,任务栈的输出如下:

Task{bf82c4b #29 type=standard A=10147:com.example.app U=0 visible=true sz=1}
* ActivityRecord{ea24a0e u0 com.example.app/.SingleInstancePerTaskActivity t29}
Task{68f9c5f #28 type=standard A=10147:com.example.app U=0 visible=false sz=1}
* ActivityRecord{a528cfe u0 com.example.app/.SingleInstancePerTaskActivity t28}

可以看到,SingleInstancePerTaskActivity 的两个实例分别存在于不同的任务栈中。

四、与 singleInstance 的区别

虽然 singleInstancesingleInstancePerTask 都限制了 Activity 的实例数量,但它们的区别在于:

  • singleInstance 确保整个系统中只有一个实例,并且该 Activity 独占一个任务栈。
  • singleInstancePerTask 则允许多个任务栈中存在多个实例,但每个任务栈中只能有一个该 Activity 的实例。

五、结论

singleInstancePerTask 作为 Android 12 新增的启动模式,提供了灵活的任务栈管理方式,适用于需要在不同任务栈中复用 Activity 的场景。相较于 singleTasksingleInstance,它在任务栈管理上提供了更高的自由度。

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

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

相关文章

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装 前言LiveCharts.Wpf介绍LiveCharts.Wpf的安装总结 前言 根据项目需求&#xff0c;我单独留了一个界面用于进行数据分析。数据分析的内容考虑是采用图表的形式将SQLite数据库中存储的数据进行绘制成图&#xff0c;以便数据分析。…

HTB:Broker[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which open TCP port is running the ActiveMQ service? 使用fscan对靶机开放端口进行扫描 使用nmap对靶机开放端口进行脚本、服务信息扫描 2.What is the version of the ActiveMQ service running on the box? 3.What is the 2023 …

windows下安装VirtualBox7.1.4

记录详细的安装过程与遇到的问题&#xff1b; 下载地址 virtualbox官网 清华镜像源下载 下载完成后文件&#xff1a; 双击打开&#xff1b; 报错了 意思是需要pc上先安装Microsoft Visual C 2019 https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redi…

C++ 中的线程、锁、条件变量。

线程 0.Linux中有POSIX标准的线程&#xff0c;Boost库中也支持线程&#xff08;比如thread_group 和 upgrade_lock &#xff09;&#xff0c;C11<thread>头文件中也提供了相应的API支持我们使用线程。它们三个&#xff0c;你学会一个&#xff0c;自然触类旁通。 1.创建…

Java-类与对象-下篇

关于类与对象&#xff0c;内容较多&#xff0c;我们分为两篇进行讲解&#xff1a; &#x1f4da; Java-类与对象-上篇&#xff1a;————<传送门:Java-类与对象-上篇-CSDN博客> &#x1f4d5; 面向对象的概念 &#x1f4d5; 类的定义格式 &#x1f4d5; 类的使用 …

特斯拉Optimus:展望智能生活新篇章

近日&#xff0c;特斯拉举办了 "WE ROBOT" 发布会&#xff0c;发布会上描绘的未来社会愿景&#xff0c;让无数人为之向往。在这场吸引全球无数媒体的直播中&#xff0c;特斯拉 Optimus 人形机器人一出场就吸引了所有观众的关注。从多家媒体现场拍摄的视频可以看出来&…

【C++】C++11新特性——右值引用,来看看怎么个事儿

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、左值引用和右值引用二、右值引用和移动语义2.1 移动构造2.2 移动赋值2.3 STL容器插入接口2.4 左值右值相互…

【C++复习】经典笔试题

文章目录 八大排序快排过程 卡特兰数反转链表链表的回文结构左叶子之和另一棵树的子树归并排序类与对象编程训练杨辉三角字符串乘积二叉树前序遍历成字符串数组的交集二叉树的非递归前序遍历连续子数组的最大乘积 八大排序 插冒归稳定 快排过程 以 [3,4,6,1,2,4,7] 为例&#…

【计网笔记】以太网

经典以太网 总线拓扑 物理层 Manchester编码 数据链路层 MAC子层 MAC帧 DIX格式与IEEE802.3格式 IEEE802.3格式兼容DIX格式 前导码&#xff08;帧开始定界符SOF&#xff09; 8字节 前7字节均为0xAA第8字节为0xAB前7字节的Manchester编码将产生稳定方波&#xff0c;用于…

steam游戏模拟人生3缺少net framework 3.5安装不成功错误弹窗0x80070422怎么修复

模拟人生3在Steam上运行时提示缺少.NET Framework 3.5并出现错误代码0x80070422&#xff0c;通常意味着.NET Framework 3.5功能没有正确启用&#xff0c;或者安装过程中出现了问题。以下是解决这个问题的步骤&#xff1a; 1.启用Windows功能 按下Win R键&#xff0c;输入opti…

【论文学习与撰写】论文里的Mathtype公式复制粘贴,跨文档复制后错码/错位问题的解决

1、描述 问题&#xff1a;论文的草稿已经写好&#xff0c;里面的公式之类的都已经一个个打上去了 但是把草稿里的正文和公式粘贴在另一个文档里的时候&#xff0c;会出些公式格式错误的情况 那该怎么操作保证复制后的公式保持原格式呢 选中复制的内容&#xff0c;在另一个文…

MySQL【知识改变命运】10

联合查询 0.前言1.联合查询在MySQL里面的原理2.练习一个完整的联合查询2.1.构造练习案例数据2.2 案例&#xff1a;⼀个完整的联合查询的过程2.2.1. 确定参与查询的表&#xff0c;学⽣表和班级表2.2.2. 确定连接条件&#xff0c;student表中的class_id与class表中id列的值相等2.…

【c++篇】:解析c++类--优化编程的关键所在(一)

文章目录 前言一.面向过程和面向对象二.c中的类1.类的引入2.类的定义3.类的封装和访问限定符4.类的作用域5.类的实例化6.类对象模型 三.this指针1.this指针的引出2.this指针的特性3.C语言和c实现栈Stack的对比 前言 在程序设计的广袤宇宙中&#xff0c;C以其强大的功能和灵活性…

[k8s理论知识]6.k8s调度器

k8s默认调度器 k8s调度器的主要职责&#xff0c;就是为一个新创建出来的pod寻找一个适合的节点Node。这包括两个步骤&#xff0c;第一&#xff0c;从所有集群的节点中&#xff0c;根据调度算法挑选出所有可以运行该pod的节点&#xff0c;第二&#xff0c;从第一步的结果中&…

Java项目-基于springboot框架的企业客户信息反馈系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。

10-Docker安装Redis

10-Docker安装Redis Docker安装Redis 以 Redis 6.0.8 为例&#xff1a; docker pull redis:6.0.8直接pull会出现以下错误 [rootdocker ~]# docker pull redis:6.0.8 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request can…

[Python学习日记-50] Python 中的序列化模块 —— pickle 和 json

[Python学习日记-50] Python 中的序列化模块 —— pickle 和 json 简介 pickle 模块 json 模块 pickle VS json 简介 什么叫序列化&#xff1f; 序列化指的是将对象转换为可以在网络上传输或者存储到文件系统中的字节流的过程。序列化使得对象可以被保存、传输和恢复&#…

3D Slicer 教程二 ---- 数据集

上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …

C++贪心

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法策略。贪心算…