singleTaskAndroid的Activity启动模式知识点总结
一. 前提知识
1.1. 任务栈知识
二. Activity启动模式的学习
2.1 standard
2.2 singleTop
2.3.singleTask
2.4.singleInstance
引言:
Activity作为四大组件之一,也可以说Activity是其中最重要的一个组件,其负责调节APP的视图,和用户交互功能,可以说非常重要,当我们深入了解了Activity的生命周期之后,就可以写出更流畅的程序。
Activity的启动模式:
我们的Activity会根据自身不同的启动模式,自身的生命周期方法会进行不同的调用。我们应该根据特定的需求,为每个Activity指定恰当的启动模式。我们可以在A你的肉i的Mainfest.xml中通过给 <activity> 标签指定android:launchMode属性来选择启动模式。
一.前提知识
1.1任务栈知识
我们先来了解一下什么是任务栈:说白了,任务栈就是用来存放任务的,每个应用都有一个任务栈,来存放不同的任务。
看图了解下:

出现的顺序就是根据我们上面的数字顺序。
二.Activity启动模式的学习
2.1 standard(标准模式)
standard作为Activity的默认启动模式,在不进行显示指定的情况下,所有Activity都会自动使用这种启动模式。到现在为止,我们写过的所有Activity都是使用的standard模式。我们知道Android是使用返回栈来管理Activity的,在standard模式中,每当启动一个新的Activity,其就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的Activity,系统不会在意这个Activity是否已经在返回栈中存在,每次启动都会创建一个该Activity的新实例。
我们现在通过代码实践体会standard模式,修改项目,首先来看代码:
1.默认情况下都是Standard模式
2.一个叠加一个,符合先进后出的规律
先看一下配置形式的代码:
<activity android:name=".standard.StandardActivity"
android:launchMode="standard" >
接下来,我们解析一下这段代码:
1. android:name 属性
这是 Activity 的完全限定类名。
在你的例子中, StandardActivity 位于 com.example.holiday.standard 包中。
举个例子,如果我们的的应用包名是 com.example.holiday ,那么完整的类名应该是 com.example.holiday.standard.StandardActivity 。
2. android:launchMode 属性
launchMode 定义了 Activity 的启动模式,决定了 Activity 在任务栈中的行为。
在我们的例子中, launchMode 被设置为 "standard" ,这是默认的启动模式。
3. 同样,因为 standard 是默认的模式,所以 android:launchMode 可以不进行声明,因为默认就
是 standard
我们简单看图举个例:

图2:standard 模式,添加Activity页面时的栈变化
2.2 singleTop(栈顶复用模式)
这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。
当跳到一个SingleTop模式的Activity时:
1.判断当前的任务栈的栈顶是否是该Activity
2.如果栈顶不是,则新建一个,并正常入栈3.如果栈顶是,直接复用栈顶的Activity,不新建Activity
配置一下代码:
<activity android:name=".singletop.SingleTopActivity"
android:launchMode="singleTop">
接下来我们看图理解Acitivty的栈顶复用模式的过程图:
图3:起初的Activity的任务栈

图4:添加Activity页面时的栈的变化

图5:Activity0退回栈的变化

singleTop模式分3种情况
1.当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法
2.当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例
3.当前栈中不存在该Activity的实例时,其行为同standard启动模式
standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你
指定了taskAffinity属性。
那么什么是taskAffinity属性呢,可以简单的理解为任务相关性。
1.这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字
为应用的包名
2.我们可以单独指定每一个Activity的taskAffinity属性覆盖默认值
3.一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity
4.在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个
任务
5.为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task
2.3singleTask(栈内复用模式)
使用singleTop可以很好的解决重复创建栈顶Activity的问题,但是我们知道如果该Activity并没有处于栈顶位置,还有可能会创建多个Activity实例的。那么有没有办法可以让某个Activity在整个应用程序的上下文只存在一个实例呢?这就要借用singleTask模式来实现了。当Activity启动模式指定为singleTask时,每次启动Activity,系统首先会在返回栈中检查是否存在Activity的实例,如果发现则直接使用该实例;并把这个Activity之上的所有其他的Activity统统出栈,如果没有就会创建一个新的。
配置一下代码:
<activity android:name=".singletask.SingleTaskActivity"
android:launchMode="singleTask">

图7:起初的Activity的任务栈

图8:singleTask的Activity的任务栈启动模式
2.4singleInstance(单实例模式)
singleInstance模式算是四种启动模式里最复杂也是最特殊的的一个了,我们需要多花时间来理解这个模式。不同于以上3种启动模式,指定为singleIeInstance模式的Activity会启用一个新的返回栈来管理这个Activity(其实如果 singleTask 模式指定了不同的taskAffinity,也会启动一个新的返回栈)。那么这样做有什么意义呢?想象以下场景,假设我们的程序中有一个Activity是允许其他程序调用的,如果想实现其他程序和我们的程序可以共享这个Activity的实例,应该如何实现呢?使用前面3种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个Activity不同的返回栈中入栈时必然创建了新的实例。而使用singleinstance 模式就可以解决这个问题,在这种模式下,会有一个单独的返回栈来管理这个 Acivity,不管是哪个应用程序来访问这个Activity,都共用同一个返回栈,也就解决了共享Aciviy实例的问题。
配置一下代码:
Activity1是SiglelnInstarce模式
<activity android:name=".singleInstance.SingleleInstanceActivity"
android:launchMode="singleInstance">

图10:启动创建Activity0


图12:Activity1启动Activity2

图13:Activity2启动Activity3
相关文章:
singleTaskAndroid的Activity启动模式知识点总结
一. 前提知识 1.1. 任务栈知识 二. Activity启动模式的学习 2.1 standard 2.2 singleTop 2.3.singleTask 2.4.singleInstance 引言: Activity作为四大组件之一,也可以说Activity是其中最重要的一个组件,其负责调节APP的视图ÿ…...
Java Stream 全面解析
Java Stream 全面解析 Java 8 引入的 Stream API 提供了一种高效且声明式的方式来处理集合数据。Stream 允许你以函数式编程风格操作数据,支持并行处理,并且可以显著简化代码。下面我们将从 创建操作、中间操作 和 终端操作 三个方面进行全面深入的解析…...
OpenCV识别电脑摄像头中的圆形物体
思路步骤 初始化摄像头:使用cv2.VideoCapture打开电脑摄像头。处理每一帧图像:对摄像头捕获的每一帧图像进行处理,包括灰度化、高斯模糊、霍夫圆变换等操作。绘制圆形和圆心:如果检测到圆形,使用cv2.circle函数用黄线…...
如何在 Tomcat 中屏蔽错误报告
Tomcat 屏蔽错误信息 <h1>HTTP状态 400 - 错误的请求</h1><hr class"line" /><p><b>类型</b> 异常报告</p><p><b>消息</b> 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义</p>&…...
Vue 入门到实战 十
第10章 Vue Router 目录 10.1 什么是路由 10.2 Vue Router的安装 10.2.1 本地独立版本方法 10.2.2 CDN方法 10.2.3 NPM方法 10.2.4 命令行工具(Vue CLI)方法 10.3 Vue Router的基本用法 10.3.1 跳转与传参 10.3.2 配置路由 10.…...
jenkins-获取当前时间戳
一. 简述: 很多场景下,需要获取当前时间戳。 二. 使用方法: 1. 安装: 最简单的, 莫过于直接部署相关插件: Build Timestamp Plugin 2. 配置: 3. 使用: post {success {script…...
springboot mybatis-plus 集成多数据源
在 Spring Boot 项目中集成 MyBatis-Plus 并配置多数据源,可以按照以下步骤进行。这个示例将展示如何配置两个数据源,并确保每个数据源都有自己对应的 SqlSessionFactory 和事务管理器。 1. 添加依赖 首先,在你的 pom.xml 文件中添加必要的…...
SSH 登录到 Linux 服务器为什么没有要求输入密码
如果你通过 SSH 登录到 Linux 服务器时没有要求输入密码,通常有以下几种可能性: 1. 使用 SSH 密钥认证 最常见的原因是你的 SSH 登录使用了 公钥认证,而不是密码认证。在这种情况下,服务器上已经配置了你的公钥,并且…...
Kafka 中基于 Segment 和 Offset 查找消息的过程
Kafka 中基于 Segment 和 Offset 查找消息的过程 假设我们有一个 Kafka Topic,其 Partition 划分为多个 Segment 文件。每个 Segment 文件包含 .log、.index 和 .timeindex 文件。现在我们需要查找 Offset 为 368801 的消息。 假设条件 Partition:par…...
【Jenkins流水线搭建】
Jenkins流水线搭建 01、SpringBoot项目 - Jenkins基于Jar持续集成搭建文档基于手动方式发布项目基于dockerfile基于jenkins + dockerfile + jenkinsfile +pieline基于jenkins + jar方式的发布01、环境说明01、准备项目02、准备服务器03、安装git04、安装jdk1.805、安装maven依赖…...
【Java】规则引擎 Drools
https://www.bilibili.com/video/BV1nW421R7qJ 来自尚硅谷 背景 /*** 设置订单积分*/ public void setOrderPoint(Order order){if (order.getAmout() < 100){order.setScore(0);}else if(order.getAmout() > 100 && order.getAmout() < 500){order.setScore(…...
Transformer以及BERT阅读参考博文
Transformer以及BERT阅读参考博文 Transformer学习: 已有博主的讲解特别好了: 李沐:Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibili知乎:Transformer模型详解(图解最完整版) - 知乎 个人杂想&…...
深入浅出Java反射:掌握动态编程的艺术
小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中,学习…...
python 替换字符串
在 Python 中,替换字符串可以通过多种方式实现,具体取决于您的需求和上下文。以下是几种常见的方法: 1. 使用 str.replace() 方法 str.replace(old, new[, count]) 是最常用的字符串替换方法。它会将字符串中的所有匹配项替换为新的字符串。…...
数据挖掘智能Agent
🤗 CodeGenie - 智能编程助手 数据处理和分析对于数据分析工作人员来说,往往既复杂又令人头疼,需要耗费大量精力进行重复性工作。为了解决这一问题,我们开发了一款集成了自然语言处理和代码生成功能的智能编程助手——CodeGenie。…...
动手学深度学习11.7. AdaGrad算法-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址:11.7. AdaGrad算法…...
【鸿蒙开发】第三十六章 状态管理 - (V2)
目录 1 V2所属装饰器 1.1 ObservedV2装饰器和Trace装饰器:类属性变化观测 1、概述 2、装饰器说明 3、使用限制 1.2 ComponentV2装饰器:自定义组件 1、概述 1.3 Local装饰器:组件内部状态 1、概述 2、装饰器说明 3、…...
基础算法# 求一个数的二进制表示当中有几个1 (C++)
文章目录 题目链接题目解读思路完整代码参考 题目链接 题目解读 给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。 如5的二进制为101,包含2个“1”。 思路 直接将该数字转为二进制表示,求其有几个1即可。 完整代码 #include<bits/stdc.…...
3D机器视觉的类型、应用和未来趋势
3D机器视觉的类型、应用和未来趋势 类型 3D机器视觉技术主要分为以下几类: 立体视觉(Stereo Vision) 通过两个或多个摄像头从不同角度捕捉图像,利用视差计算深度信息,生成3D模型。 结构光(Structured Li…...
【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题
【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题问题描述:解决方法方法一:手动中断并重启下载方法二:使用 Bash 脚本自动化下载在…...
什么是高亮环形光源
高亮环形光源是一种常用于机器视觉、工业检测和光学测量的照明设备。其特点是光线均匀、亮度高,并且呈环形分布,能够为被检测物体提供均匀的照明,减少阴影和反光,提高图像采集的质量。 主要特点: 环形设计:光源呈环形分布,适合安装在镜头周围,能够为物体提供均匀的照明…...
SpringBoot+Vue+微信小程序的高校食堂点餐系统
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 食堂点餐系统,作为一款融合现代信息技术的高效餐饮服务利器,以其…...
gitlab修改默认端口
问题:gitlab和zabbix部署在同一台服务器上导致80端口冲突 修改gitlab默认端口为8088: 第一步:修改/etc/gitlab/gitlab.rb文件 nginx[listen_port] 8088 第二步:修改默认的gitlab nginx的web服务80端 /var/opt/git…...
大预言模型|微调大预言模型初探索(LLaMA-Factory)(1)
前言 微调模型通常比从零开始训练一个模型的技术要求低。公司不需要拥有大量的深度学习专家,利用现有的开源工具和库(如Hugging Face的Transformers等),中小型公司可以轻松地使用和微调大型模型,从而快速实现AI能力的集…...
IOTDB安装部署
IOTDB一般用于工业互联网,至于具体的介绍请自行搜索 1.环境准备 安装前需要保证设备上配有 JDK>1.8 的运行环境,并配置好 JAVA_HOME 环境变量。 设置最大文件打开数为 65535。 关闭防火墙 systemctl stop firewalld.service systemctl disable …...
【Day40 LeetCode】动态规划DP 回文子串问题
一、动态规划DP 回文子串问题 1、回文子串 647 dp数组如果采用一维的,很难进行推导。采用二维,一开始的想法是dp[i][j]表示s[i]~s[j]之间回文子串的个数,这样发现在推导递推公式时遇到困难,例如在s[i]s[j]时,不知道s…...
datasets: PyTorch version 2.5.1+cu124 available 这句话是什么意思
这句话的意思是: datasets:可能是 Python datasets 库的日志信息,说明它检测到了 PyTorch 的安装信息。PyTorch version 2.5.1cu124 available: PyTorch version 2.5.1:表示你的 PyTorch 版本是 2.5.1。cu124…...
如何通过MDM高效管理企业的Android平板?
目录 1. 批量配置设备(Batch Device Provisioning) 2. 应用推送与管理(App Deployment & Management) 3. 远程控制与故障排除(Remote Control & Troubleshooting) 4. 数据安全管理(…...
mybatis-plus逆向code generator pgsql实践
mybatis-plus逆向code generator pgsql实践 环境准备重要工具的版本供参考pom依赖待逆向的SQL 配置文件CodeGenerator配置类配置类说明 环境准备 重要工具的版本 jdk1.8.0_131springboot 2.7.6mybatis-plus 3.5.7pgsql 14.15 供参考pom依赖 <?xml version"1.0&quo…...
深入理解DOM:22个核心知识点与代码示例
本文系统介绍DOM相关的22个核心概念,每个知识点均提供代码示例及简要说明,帮助开发者全面掌握DOM操作技巧。 一、DOM基础概念 1. DOM概念 DOM(Document Object Model)是HTML/XML的编程接口,通过JavaScript可动态修改…...
