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你的肉iMainfest.xml中通过给  <activity> 标签指定androidlaunchMode属性来选择启动模式。

.前提知识

1.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

我们简单看图举个例:

2standard 模式,添加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页面时的栈的变化

5Activity0退回栈的变化

6 Activity6 栈的变化

singleTop模式分3种情况

1.当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法

2.当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例

3.当前栈中不存在该Activity的实例时,其行为同standard启动模式

standardsingleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你

指定了taskAffinity属性。

那么什么是taskAffinity属性呢,可以简单的理解为任务相关性。

1.这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字

为应用的包名

2.我们可以单独指定每一个ActivitytaskAffinity属性覆盖默认值

3.一个任务的affinity决定于这个任务的根activityroot activity)的taskAffinity

4.在概念上,具有相同的affinityactivity(即设置了相同taskAffinity属性的activity)属于同一个

任务

5.为一个activitytaskAffinity设置一个空字符串,表明这个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的任务栈

8singleTaskActivity的任务栈启动模式

2.4singleInstance(单实例模式)

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

配置一下代码:

Activity1SiglelnInstarce模式

<activity android:name=".singleInstance.SingleleInstanceActivity"

android:launchMode="singleInstance">

10:启动创建Activity0

11 :启动 Activity1

12Activity1启动Activity2

13Activity2启动Activity3

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中使用EasyExcel

Java中使用EasyExcel 文章目录 Java中使用EasyExcel一&#xff1a;EasyExcel介绍1.1、核心函数导入数据导出数据 1.2、项目实际应用导入数据导出数据 1.3、相关注解ExcelProperty作用示例 二&#xff1a;EasyExcel使用2.1、导入功能2.2、导出功能 三&#xff1a;EasyExcel完整代…

WinForm 防破解、反编译设计文档

一、引言 1.1 文档目的 本设计文档旨在阐述 WinForm 应用程序防破解、反编译的设计方案&#xff0c;为开发团队提供详细的技术指导&#xff0c;确保软件的知识产权和商业利益得到有效保护。 1.2 背景 随着软件行业的发展&#xff0c;软件破解和反编译现象日益严重。WinForm…

基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践

目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…

AN 433:源同步接口的约束与分析

文章目录 简介时钟和数据的关系SDR&#xff08;单数据速率&#xff09;和 DDR&#xff08;双数据速率&#xff09;接口约束默认时序分析行为 源同步输出输出时钟输出时钟约束时钟电路和约束示例 以系统为中心的输出延迟约束输出最大延时输出最小延时 以系统为中心的输出时序例外…

webshell通信流量分析

环境安装 Apatche2 php sudo apt install apache2 -y sudo apt install php libapache2-mod-php php-mysql -y echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo ufw allow Apache Full 如果成功访问info.php&#xff0c;则环境安…

docker学习---第3步:docker实操大模型

文章目录 1.Images2.Container3.DockerfileENTRYPOINT和CMDCOPY和ADDLABLE、EXPOSE和VOLUME卷中的数据是如何做数据备份的&#xff1f; ARG和ENVHEALTHCHECK 4. Network&#xff08;本节讲容器与容器之间的通信方案&#xff09; 跟着b站 胖虎遛二狗学习 Docker动手入门 &…

DeepSeek系统崩溃 | 极验服务如何为爆火应用筑起安全防线?

引言 极验服务让您的产品站在风口之时&#xff0c;不必担心爆红是灾难的开始&#xff0c;而是期待其成为驱动持续创新的全新起点。 01现象级狂欢背后&#xff0c;你的业务安全防线抗得住吗&#xff1f; “近期DeepSeek线上服务受到大规模恶意攻击&#xff0c;注册可能繁忙&am…

中国计算机学会(CCF)新规解读:CSP-J/S年龄限制政策

中国计算机学会&#xff08;CCF&#xff09;新规解读&#xff1a;CSP-J/S年龄限制政策 一、政策背景与动机 问题根源 低龄化竞赛趋势&#xff1a;近年来&#xff0c;CSP-J/S&#xff08;非专业级软件能力认证&#xff09;参赛者中小学生比例显著增加&#xff0c;部分学生甚至在…

K8s之存储卷

一、容忍、crodon和drain 1.容忍 即使节点上有污点&#xff0c;依然可以部署pod。 字段&#xff1a;tolerations 实例 当node01上有标签test11&#xff0c;污点类型为NoSchedule&#xff0c;而node02没有标签和污点&#xff0c;此时pod可以在node01 node02上都部署&#xff0c…

用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理&#xff0c;可以从以下几个方面入手&#xff0c;结合理论知识和实例进行学习&#xff1a; 贝叶斯定理与智能世界的暗语 条件概率&#xff0c;全概率公式与贝叶斯公式的推导&#xff0c;理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …

JAVA学习第三天

继承关系变量访问的特点 01.方法中找 02.子类变量定义中找 03.父类中找 this和super关键字的使用区别&#xff1a; super父类构造函数的使用&#xff1a; 使用子类构造函数时&#xff0c;都会初始化父类的数据&#xff0c;自动调用父类的无参构造函数 super内存图——007 继…

多媒体软件安全与授权新范例,用 CodeMeter 实现安全、高效的软件许可管理

背景概述 Reason Studios 成立于 1994 年&#xff0c;总部位于瑞典斯德哥尔摩&#xff0c;是全球领先的音乐制作软件开发商。凭借创新的软件产品和行业标准技术&#xff0c;如 ReWire 和 REX 文件格式&#xff0c;Reason Studios 为全球专业音乐人和业余爱好者提供了一系列高质…

计算机三级网络技术知识点全面总结

声明1 本文参考了计算机三级网络技术考过指南和其他网络教程写成&#xff0c;感谢这些作者提供的资料声明2 如果存在错误和不足&#xff0c;欢迎提出评判建议&#xff1b;如果涉及侵权&#xff0c;请联系我进行删除声明3 本文还提供了PDF版本以便下载&#xff0c;所有资料均完全…

【数据结构】(8) 二叉树

一、树形结构 1、什么是树形结构 根节点没有前驱&#xff0c;其它节点只有一个前驱&#xff08;双亲/父结点&#xff09;。所有节点可以有 0 ~ 多个后继&#xff0c;即分支&#xff08;孩子结点&#xff09;。每个结点作为子树的根节点&#xff0c;这些子树互不相交。 2、关于…

qt中实现QListWidget列表

FR:徐海涛&#xff08;hunkxu)

网络工程师 (35)以太网通道

一、概念与原理 以太网通道&#xff0c;也称为以太端口捆绑、端口聚集或以太链路聚集&#xff0c;是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作&#xff0c;共同承担数据传输任务&#xff0c;从而提高了网络的传输能力和可靠性。 二…

8K样本在DeepSeek-R1-7B模型上的复现效果

7B Model and 8K Examples: Emerging Reasoning with Reinforcement Learning is Both Effective and Effic (notion.site) 港科大助理教授何俊贤的团队以Qwen2.5-Math-7B&#xff08;基础模型&#xff09;为起点&#xff0c;直接对其进行强化学习。整个过程中&#xff0c;没有…

Docker部署Alist网盘聚合管理工具完整教程

Docker部署Alist网盘聚合管理工具完整教程 部署alist初始化修改密码添加存储&#xff01;联通网盘阿里云盘百度网盘 部署alist 本文以Linux Docker部署&#xff0c;假设你已经安装好Docker docker run -d --restartalways \-v /your/data:/opt/alist/data \-p 5244:5244 \-e …

SpringMVC环境搭建

文章目录 1.模块创建1.创建一个webapp的maven项目2.目录结构 2.代码1.HomeController.java2.home.jsp3.applicationContext.xml Spring配置文件4.spring-mvc.xml SpringMVC配置文件5.web.xml 配置中央控制器以及Spring和SpringMVC配置文件的路径6.index.jsp 3.配置Tomcat1.配置…