当前位置: 首页 > news >正文

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

相关文章:

  • 374_C++_升级等其他类型标签,使用将4字节字符串转换为无符号整数的定义方式
  • Managed Lustre 和 WEKA:高性能文件系统的对比与应用
  • 图像缩放的双线性插值实现方式
  • Reasoning in High Gear 推理加速发展
  • 【Java八股文】02-Java集合面试篇
  • docker容器部署jar应用导入文件时候报缺少字体错误解决
  • DeepSeek预测25考研分数线,复试资料分享
  • 【弹性计算】弹性计算的技术架构
  • 在springboot加vue项目中加入图形验证码
  • Windows软件自动化利器:pywinauto python
  • 用什么办法能实现ubuntu里面运行的自己开发的python程序能自动升级。
  • 【横川咨询】开发了一个极简音乐播放器
  • 【原创】解决vue-element-plus-admin无法实现下拉框动态控制表单功能,动态显隐输入框
  • 解释下SpringBoot中的服务、依赖项、微服务、分布式的概念和关系
  • error: conflicting types for ‘SSL_SESSION_get_master_key’
  • 笔试题笔记#4、5 记录划水过程
  • 11苍穹外卖之Apache ECharts(数据可视化图表、后端传数据)
  • 批量修改mysql字符串字段子字符串
  • PhotoShop中创建窗口使用对应按钮创建对应图层简单示例
  • Linux 设置静态IP
  • 长沙查处疑似非法代孕:有人企图跳窗,有女子被麻醉躺手术台
  • 泽连斯基:乌克兰已做好与俄罗斯举行会谈的准备
  • 金科股份重整方案通过,正式进入重整计划执行环节
  • 乘客被地铁厕所门砸伤,南京地铁:突然坏的,已和乘客沟通处理
  • 马上评|让“贾宝玉是长子长孙”争议回归理性讨论
  • 上海发布预付卡消费“10点提示”:警惕“甩锅闭店”套路