Android 第5种启动模式:singleInstancePerTask

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 thereforethere will only be one instance of this activity in a task. However, unlikesingleTask, 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.rhkb.cn/news/452907.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据新视界 --大数据大厂之 Apache Beam:统一批流处理的大数据新贵

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

OpenCV高级图形用户界面(18)手动设置轨迹条(Trackbar)的位置函数setTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数设置指定窗口中指定轨迹条的位置。 注意 [仅 Qt 后端] 如果轨迹条附加到控制面板&#xff0c;则 winname 可以为空。 函数原型 void cv…

插件发布新特性,让运动适配更简单。

为了让广大开发者更好的适配各AI运动场景&#xff0c;我们的AI运动识别插件已经迭代了23个版本&#xff0c;最近又迎来了我们的1.5.5小版本更新&#xff0c;本次更新了2个新特性&#xff0c;新特性有助于大家更好的适配新运动&#xff0c;更轻松的开发健身、体育、体测、AR互动…

Veritas NetBackup 10.5 发布,新增功能概览

Veritas NetBackup 10.5 发布&#xff0c;新增功能概览 Veritas NetBackup 10.5 (Unix, Linux, Windows) - 领先的企业备份解决方案 The #1 enterprise backup and recovery solution. 请访问原文链接&#xff1a;https://sysin.org/blog/veritas-netbackup-10/ 查看最新版。…

PPT自动化:快速更换PPT图片(如何保留原图片样式等参数更换图片)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT更换图片 📒1. 安装 `python-pptx` 模块2. 加载PPT文件3. 查找并替换图片3.1 查找图片形状3.2 获取原图片的样式和位置3.3 替换图片4. 保存修改后的PPT文件5. 设置图片的相关参数5.1 设置透明度5.2 设置边框🚀 保留所有参…

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xf…

upload-labs靶场Pass-01

upload-labs靶场Pass-01 分析 查看提示&#xff0c;提示如下 查看源码 function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传…

Halcon 使用二维像素分类对图像进行分割

文章目录 算子histo_2dim 计算双通道灰度值图像的直方图class_2dim_sup 使用二维像素分类对图像进行分割 示例 算子 histo_2dim 计算双通道灰度值图像的直方图 histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )Regions (输入对象)&#xff1a;在此区域内计算直方图…

[STM32] 简单介绍 (一)

文章目录 1.STM32简介2.ARM3.STM32F103ZET6/STM32F103C8T64.STM32命名规则5.STM32最小系统板6.STM32开发方式7.STM32系统架构8.STM32时钟系统9.STM32中断系统9.1 NVIC嵌套向量中断控制器9.2 EXIT外部中断控制器 10.STM32定时器 1.STM32简介 STM32是ST公司基于ARM Cortex-M内核…

水题四道。

我的 水题四道--题目目录 问题 A: 依次输出第k小整数 代码1 问题 B: 第k小整数(knumber) 代码2 树的统计 代码3 枪声问题 代码4 问题 A: 依次输出第k小整数 现有n个正整数&#xff0c;n≤10000&#xff0c;要求出这n个正整数中的第1小的整数&#xff0c;第2小的整数&#xf…

基于Multisim温控电风扇控制电路(含仿真和报告)

【全套资料.zip】温控电风扇控制电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 2.1 设计内容 设计制作一个温控风扇自动控制系统电路。 2.2 设计要求 设计一温控风扇控制系统&am…

汽车管理系统——主界面制作

目录 主界面需要有什么&#xff1f;然后要做什么&#xff1f;添加两个主菜单&#xff08;声明&#xff09;下一步应该干什么&#xff1f;能够跳转到文件有哪几个动作&#xff1f;动作如何声明&#xff1f;为什么用选择声明指针&#xff0c;不选择直接声明这个对象&#xff1f; …

IO进程_day1

目录 概要 标准IO 1.概念&#xff1a; 2.特点&#xff1a; 3.缓存区 3.1行缓存&#xff1a;和终端操作相关 3.2全缓存&#xff1a;和文件操作相关 ​​​​​​​3.3不缓存&#xff1a;标准错误 stderr 4.函数 ​​​​​​​4.1打开文件 ​​​​​​​4.2关闭文件…

Java项目-基于springboot框架的体育馆运营系统项目实战(附源码+文档)

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

【STM32学习】PWM学习(四),散热风扇的控制,PWM调速调制,

目录 1、基础概念 2、PWM调速风扇功能介绍 2.1风扇功率 2.2、PWM输出流程图 2.3、PWM占空比计算 2.4参数计算 3、配置实现 3.1、添加TIM1功能 3.2、生成代码 3.3、修改代码 1、基础概念 参考&#xff1a;【STM32学习】PWM脉冲宽度调制学习笔记&#xff0c;&#xff…

量化交易:最大回撤(Drawdown)算法

量化交易:最大回撤(Drawdown)算法 写在前面: 本文为本人学习用于回测报告中的最大回撤算法指标时整理的学习笔记,欢迎沟通交流~ 一、基本概念 1.1 最大回撤(Max Drawdown) 回撤:对于任意日期区间,回撤 = 钱包的亏损比例 =(现值 - 原值)/ 原值 = 现值 / 原值 - 1 =…

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

java -jar 命令自动重启 Java 项目

一、java -jar 方式运行项目 重启Java项目通常意味着你需要先停止当前运行的Java进程&#xff0c;然后再次启动它。下面是在CentOS上执行这些步骤的一种常见方法&#xff1a; 停止Java进程 找到Java进程的PID&#xff1a; 使用ps命令配合grep来查找运行中的Java进程的PID&#…

关于WPF项目降低.Net版本

本来有项目是.NET Framework 4.8的&#xff0c;为了兼容升级到.NET 8.0&#xff0c;后期又为了兼容放弃.NET 8.0&#xff0c;升级的步骤&#xff1a;利用vs2022 的 .NET Upgrade Assistant 扩展&#xff0c;磕磕绊绊也升级完成了&#xff1b; 扩展链接&#xff1a; Upgrading…

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…