众所周知,当我们多次启动同一个Activity时,会创建多个该Activity的实例,系统会按照先进后出的原则,将它们一一放进任务栈中,然后我们按back键,系统就会将栈顶的Activity移除栈,直至栈中没有Activity,系统就会回收这个任务栈。这就是默认的Activity启动模式:standard模式。在该模式下,每次启动Activity都会创建一个新的实例,不利于内存的利用,这种做法显然不合理,为了优化这个问题,Android提供4种Activity启动模式,在不同的情况下选择不同的复用机制避免出现实例重复创建问题。

进入正题,Acticity的启动模式如下:

standard、singleTop、singleTask、singleInstance

1、standard(标准模式)

这是系统的默认启动模式,不管这个Activity的实例是否存在于任务栈中或者和启动它的Activity是否在相同的任务栈中,每次启动Activity都会创建一个新的实例。这样创建的Activity会依次执行onCreate、onStart、onResume生命周期方法。这种情况下,谁启动了它,它就属于启动它的Activity的任务栈中,例如MainActivity启动MainActivity2,MainActivity2就会位于MainActivity所在任务栈的栈顶。具体查看日志的方法如下:adb shell dumpsys activity ,我们只看 Running activities (most recent first): 部分。

Running activities (most recent first):
TaskRecord{baa1051 #2748 A=me.bakumon.launchmode U=0 StackId=1 sz=2}
Run #12: ActivityRecord{1d38839 u0 me.bakumon.launchmode/.Main2Activity t2748}
Run #11: ActivityRecord{6a0be5 u0 me.bakumon.launchmode/.MainActivity t2748}

说明 Main2Activity 和 MainActivity 位于相同的栈:#2748,并且 Main2Activity 位于栈顶。

2、singleTop(栈顶复用模式)

这个模式下,如果Activity的实例已经存在在栈顶,启动它就不会再创建新的实例,而是会调用onNewIntent,通过此方法的参数我们可以去除当前请求的信息。随后会调用onResume方法,不再调用onCreate、onStart方法,因为它没有变化。如果没有存在的话,就会如同standard模式一样。这种模式可以用来防止多次打开同一个Activity

对于以上的两种模式总结下:

standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。taskAffinity属性标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。重要的是即使设置了taskAffinity属性,对standard和singleTop模式不会有任何影响,这两种启动模式下不会创建新的task。

3、singleTask(栈内复用模式)

在这个模式下,如果栈内存在该Activity的实例,不管是否存在于栈顶都不会再创建实例,而是会将该实例前的Activity清出栈顶(cleanTop),并且会回调onNewIntent方法。其实在这个过程中,首先是会进行任务栈的匹配,这个任务栈就是通过taskAffinity属性指定,如果不存在这个任务栈,就会创建一个任务栈,并将该Activity放入栈中。流程图比较清晰,如下所见:

4、singleInstance(全局唯一模式)

该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

参考链接:

http://blog.csdn.net/mynameishuangshuai/article/details/51491074

https://juejin.im/post/591bd09a2f301e006bcd6e43

深入理解Activity的启动模式的更多相关文章

  1. Android开发艺术2之Activity的启动模式

    Activity是Android的四大组件之一,他的重要性毋庸置疑,对于这么重要的一个组件,我们首先要知道这些都是由系统进行管理和回调的,要理解Activity的启动模式,我们首先来了解一下Andro ...

  2. Activity的启动模式(android:launchMode)

    在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...

  3. 4种activity的启动模式

    在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...

  4. Activity 的启动模式

    好久没用过那几种activity的启动模式了,如今看到singletop竟然傻了眼,完全忘记了这几种启动模式的区别!隧将两年前的总结翻出来,通读一遍那晦涩难懂的记录,又理解了一遍,在以前记录的基础上, ...

  5. 我所理解的Android 启动模式

    首先,这是从 一个开源网站转载的,觉得写得不错,对我们之前理解的activity的启动模式是一个新的理解方式,并给出实际的应用场景. 任务栈是什么 任务栈Task,是一种用来放置Activity实例的 ...

  6. Activity的启动模式--总结

    3. Activity的任务栈Task以及启动模式与Intent的Flag详解? 2,Activity次级页面和主页间来回跳转,防止重复创建Activity实例 1, activity的启动模式: / ...

  7. Activity生命周期,切换,参数传递,bundle(包),值对象,Activity参数返回,Activity的启动模式

    Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口.它是android应用中最重要的组成单元之一,提供了和用户交互的可视化界面.在一个Activity中,可以添加很多组件,这些组件负责具体的 ...

  8. Activity之启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Ac ...

  9. 关于activity的启动模式

    在Android中每个界面都是一个Activity ,界面的切换实际上是对不同Activity实例化的过程.而启动模式就决定Activity启动运行方式. 1.设置方式它是在主配置文件中,Activi ...

随机推荐

  1. 如何使用LightningChart拖放功能进行数据转移 ?

    本文主要介绍如何使用LightningChart扩展拖放功能为所有图表组件创建图表,如:系列,标题,轴线等等.支持用鼠标放置自定义对象到另一个图表中,如:可以添加或修改JSON/CSV或其他格式的数据 ...

  2. 关于WAMPserver配置httpd.conf无法修改根目录解决方法

    最近在学习php开发, 在慕课网上先听了安装配置WAMP server的课,可是第二步配置网站根目录的地方就出错了,按照网课上讲的将httpd.conf文件中的 [Document] 和[Direct ...

  3. WPF 截屏软件开发

    最近由于工程需要开始研发基于Windows的自动录屏软件,很多细节很多功能需要处理,毕竟一个完美的录屏软件不是你随随便便就可以写出来的.首先参考了大部分的录屏软件,在研发的过程中遇到了很多的问题:比如 ...

  4. C++11 新特性总结

    前言 转载请注明出处,感谢! C++11 的新特性 1 变量和基本类型 1.1 long long 类型 扩展精度浮点数,10位有效数字 1.2 列表初始化 初始化的几种不同形式,其中用花括号来初始化 ...

  5. Java异常处理机制 —— 深入理解与开发应用

    本文为原创博文,严禁转载,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Exceptio ...

  6. APP被苹果App Store拒绝的79个原因【转】

    作为iOS开发者,估计有很多都遇到过APP提交到App Store被拒,然后这些被拒的原因多种多样,今天dApps收集了常见的被拒的原因,以便更多开发者了解. APP被苹果APPStore拒绝的各种原 ...

  7. 读 Zepto 源码之内部方法

    数组方法 定义 var emptyArray = [] concat = emptyArray.concat filter = emptyArray.filter slice = emptyArray ...

  8. 深度学习开发环境搭建教程(Mac篇)

    本文将指导你如何在自己的Mac上部署Theano + Keras的深度学习开发环境. 如果你的Mac不自带NVIDIA的独立显卡(例如15寸以下或者17年新款的Macbook.具体可以在"关 ...

  9. 手机QQ无法临时会话的解决方案

    手机网页发起临时会话:    <a href="mqqwpa://im/chat?chat_type=wpa&uin=3355135984&version=1& ...

  10. POJ 1743 不可重叠的最长重复子串

    原问题,其实是找最长的相似子串,所谓相似就是一个子串每个值加上一个偏移值可以得到另一个子串. 我们先求原数组的差值数组,对新数组求后缀数组,二分答案,判定是否有某个Height数组中的sa最小值与最大 ...