众所周知,当我们多次启动同一个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. Java进阶之内存管理与垃圾回收

    Java是在JVM所虚拟出的内存环境中运行的.内存分为栈(stack)和堆(heap)两部分.我们将分别考察这两个区域. 栈 在Java中,JVM中的栈记录了线程的方法调用.每个线程拥有一个栈.在某个 ...

  2. 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2

    事件要到那里去? 每个事件源处理类都维护着一个自己的事件队列, 在Monkey中叫做CommandQueue,里面装的是每个具体的MonkeyEvent事件.当来自网络的字串命令被翻译成对应的Monk ...

  3. WPF中的RichTextBox

    原文链接:http://blog.csdn.net/wuzhengqing1/article/details/7010902 取出richTextBox里面的内容 第一种方法:将richTextBox ...

  4. 操作系统之cache、伙伴系统、内存碎片、段式页式存储管理

    存储管理是操作系统非常重要的功能之一,本文主要介绍操作系统存储管理的基础知识,包括缓存相关知识.连续内存分配.伙伴系统.非连续内存分配.内存碎片等,并结合linux系统对这些知识进行简单的验证.文章内 ...

  5. 手把手视频:万能开源Hawk抓取动态网站

    Hawk是沙漠之鹰历时五年开发的开源免费网页抓取工具(爬虫),无需编程,全部可视化. 自从上次发布Hawk 2.0过了小半年,可是还是有不少朋友通过邮件或者微信的方式询问如何使用.看文档还是不如视频教 ...

  6. sql解析xml

    我们有时候需要在sql中解析xml,xml解析sql实例如下:  DECLARE @params xml  DECLARE @customparams xml = null  -- 0.解析输入参数 ...

  7. 第五章 HQL实用技术

    第五章   HQL实用技术5.1  使用HQL查询语句(面向对象查询语句)    5.1.1 编写HQL语句        5.1.1.1 from子句                    例:fr ...

  8. GitHub上最受欢迎的iOS开源项目TOP20

    AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是GitH ...

  9. memory库函数的实现

    下面主要对常用的几个memory库函数的实现(memcpy.memmove.memset.memcmp): memcpy函数与memmove函数: 相同点: 两者实现的功能均为从src拷贝count个 ...

  10. HDU 5008 求第k小子串

    本题要求第k小的distinct子串,可以根据height数组,二分出这个第k小子串所在后缀的位置信息.由于题目要求子串起始下标尽可能小.所以再在rank数组中,二分出与当前后缀LCP大于等于所求子串 ...