Activity启动模式(GIF 动态演示)

栏目: IOS · Android · 发布时间: 5年前

内容简介:关于Activity的启动模式是面试高频问题,在平时开发中,作用也不小,所以还是很有必要搞懂这一块的知识。其实之前也有写过这个主题的文章,但是当时是随便写了一点来记录的。这次准备写的完善点。同时通过gif动态演示各种模式下的入栈出栈情况,加深对四种模式的理解。Activity的启动模式是告诉Activity应该以什么样的方式来启动。Activity的启动模式有四种,分别是:其中standard模式是Activity默认启动模式。

关于Activity的启动模式是面试高频问题,在平时开发中,作用也不小,所以还是很有必要搞懂这一块的知识。其实之前也有写过这个主题的文章,但是当时是随便写了一点来记录的。这次准备写的完善点。同时通过gif动态演示各种模式下的入栈出栈情况,加深对四种模式的理解。

Activity的启动模式是告诉Activity应该以什么样的方式来启动。Activity的启动模式有四种,分别是:

  • standard
  • singleTop
  • singleTask
  • singleInstance

其中standard模式是Activity默认启动模式。

设置启动模式的方式

这里有两种方式来实现设置。

  1. 在AndroidManifest清单文件中,在注册Activity组件的时候,通过"android:launchMode"标签来设置启动模式。

    例如:

    <activity android:name=".DemoActivity"
                android:launchMode="standard"
                >
    </activity>
    复制代码

    这就表示"DemoActivity"的启动模式是standard模式。如果想把DemoActivity的启动模式改成singleTask,那么把"standard"改成"singleTask"即可。

  2. 我们通常会用startActivity()方法来跳转至指定的Activity,这里就可以通过给intent设置flag的方式来进行设置启动模式。

    例如:

    Intent intent = new Intent(this,MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    复制代码

上面这两种方式虽然都可以为Activity设置启动模式,但是还是有区别的,第二种方式不支持 singleInstance 模式,但是第二种方式的优先级高于第一种方式,当这两种方式同时存在的时候,以第二种方式为准。

四种启动模式的区别

在介绍这四种启动模式之前,要先知道任务栈(返回栈)的概念,其是一种 先进后出 的栈结构,任务就是指Activity,当启动一个新的Activity的时候,会创建这个新的Activity实例,并让其入栈,位于栈顶。当按back返回键的时候,会让当前栈顶Activity出栈。下图展示了启动Activity和返回上一层的入栈,出栈表现。

Activity启动模式(GIF 动态演示)

standard Mode

当多次启动同一个Activity的时候,会重复创建目标Activity的实例,让其入栈。例如:

设置Activity a的launch mode是standard模式。多次启动Activity a,其入栈的表现如下:

Activity启动模式(GIF 动态演示)

按返回键出栈的效果如下。

Activity启动模式(GIF 动态演示)

singleTop Mode

当目标Activity A的启动模式是singleTop时,此刻启动Activity A,如果当前栈的栈顶Activity不是Activity A,那么就会创建A的实例,并入栈。如果当前栈顶已经是A,那么再启动Activity A就无需创建A的实例,直接复用栈顶元素即可。此刻 A的onNewIntent(Intent intent)方法会触发onCreate,onStart方法不会触发 动画演示如下:

当栈顶元素不是A时:

Activity启动模式(GIF 动态演示)

当栈顶元素是A时:

Activity启动模式(GIF 动态演示)

在启动Activity的过程中,从Activity的实例化次数来对这四种模式分类,上面两种模式standard、singleTop模式,属于一类,它们是会对Activity实例化多次;接下来要介绍的singleTask、singleInstance模式属于另一种,只会对Activity创建一个实例。

singleTask Mode

说的singleTask模式,就不得不介绍一下taskAffinity属性,这个属性是对Activity对应的task栈命名的,默认情况下,所有Activity所需要的任务栈的名字是应用的包名,换句话说就是所有的Activity都用的同一个任务栈。

在singleTask模式下,启动Activity A,会先检测A对应的任务栈存不存在,不存在的话,就创新所需的任务栈,并完成初始化A,入栈行为。如果A对应的栈存在的话,要检测该栈中是否已有A的实例(A之前是否已经入栈过),如果没有,那就初始化实例,入栈;如果有的话,那就把该元素移至栈顶,该元素之前的元素全都移除出栈。

流程图如下:

Activity启动模式(GIF 动态演示)

Gif 动态演示:

Activity启动模式(GIF 动态演示)

singleInstance Mode

singleInstance模式和singleTask模式有点像,他们都是单实例模式的,即只有一个实例。但是singleInstance比严格点。当启动一个launch mode为singleInstance模式的Activity的时候,系统会为该Activity单独创建一个 专属 的任务栈,在为其所用。当重复启动该Activity的时候,由于栈中已有该实例,就直接复用就好。singleInstance模式比较简单,好理解,这里就不再用gif动态图演示了。

结语

总结一下,上面说了Activity的四种启动模式,它们分别是standard模式(默认的)、singleTop模式、singleTask模式、singleInstance模式。

根据是否会被多次创建,这四种模式可以分为两类。

一类是会被多次创建,包括standard模式,singleTop模式(目标Activity已位于栈顶,则无需创建)。

另一类是单实例模式,包括singleTask和singleInstance。

当栈内的Activity被复用的时候,onNewIntent(Intent intent)方法将被触发。

taskAffinity属性可以为Activity对应的栈设置名称,也就是为目标Activity设置对应的任务栈,常和launch mode标签配合使用。

写作不易,如果觉得文章内容对你有用的话,就点" ",鼓励一下吧,让作者更有创作的动力!

扫码加入我的个人微信公众号:Android开发圈 ,一起学习Android知识!!

Activity启动模式(GIF 动态演示)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

暗网

暗网

杰米·巴特利特 / 刘丹丹 / 北京时代华文书局 / 2018-7 / 59.00

全面深入揭秘“黑暗版淘宝”暗网的幕后世界和操纵者 现实中所有的罪恶,在暗网中,都是明码标价的商品。 暗杀、色情、恋童癖、比特币犯罪、毒品交易…… TED演讲、谷歌特邀专家、英国智库网络专家杰米•巴特利特代表作! 1、 被大家戏称为“黑暗版淘宝”的暗网究竟是什么?微信猎奇 文不能告诉你的真相都在这里了! 2、 因章莹颖一案、Facebook信息泄露危机而被国人所知的暗网......一起来看看 《暗网》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具