本文主要分析Activity的启动模式及使用场景。

一、Activity启动模式浅析
1、standard
标准模式,系统默认的启动模式。在启动Activity时,系统总是创建一个新的Activity实例。其缺点是:复用性差、占用内存,当Activity已经在栈顶时,还是会创建实例。 2、singleTop
这种模式可以实现栈顶复用的效果。
如果目标Activity已经存在于栈顶,则调用实例的 onNewIntent,否则创建一个新的实例,可以用于通知启动的内容显示,例如新闻客户端的内容页面。信息类应用的列表Activity往往也会使用这种启动模式,例如,收到新短信时,如果信息列表Activity已经在栈顶了,则直接调用其onNewIntent,而不需要创建新的Activity。
该模式下,当Activity不在栈顶时,还是会创建新的实例。例如A、B、C三个Activity处于一个任务栈中,且C在栈顶,如果C启动A,则会创建一个新的实例并置于栈顶,使得当前任务栈有两个A实例。 3、singleTask
该模式实现栈内复用的效果。如果栈内已经有目标Activity实例,则清除目标Activity上面的所有Activity、使得目标Activity直接放到栈顶,并调用目标Activity的onNewIntent方法;否则创建一个新的Activity实例。
补充,该模式Activity会在跟它有相同taskAffinity的任务中启动,并且位于这个任务的堆栈顶端,这样如果我们没有设置taskAffinity,从本应用启动的Activity就会复用当前Task,也就不会创建一个新的Task。
该启动模式,适合作为程序入口点,例如原生Launcher以及相机应用中的CameraActivity,就是使用了这种启动模式。 4、singleInstance
系统级的复用。启动Activity时,如果系统中不存在该Activity实例,则创建一个新的ActivityTask,并且独占这个Task,否则显示已有的Activity实例。通常用于系统级的应用,在整个系统中只有一个实例,例如来电提醒、闹钟提醒。 这四种启动模式创建一个新Activity实例的几率,是依次降低的。实际在使用时,往往会用到动态设置启动模式,给Intent设置特定的Flag,例如FLAG_ACTIVITY_SINGLE_TOP(对应singleTop)、FLAG_ACTIVITY_NEW_TASK(对应singleTask)。 二、使用中的注意事项
首先要注意Flag的动态设置方式,优先级高于静态方式(通过AndroidManifest.xml设置)。如果这两种设置方式混合在一起,则Activity启动过程、最终效果要分为多种情况来考虑。 其次,从非Activity组件例如Service启动Activity时,必须添加FLAG_ACTIVITY_NEW_TASK这个Flag。可以思考下,系统这样设计的原因? 再次,由于部分启动模式在启动Activity时,有时候并不会重新创建一个实例,也就不会调用其onCreate方法,而是回调onNewIntent方法,如果在启动时需要根据Intent重新加载数据,注意在onNewIntent中添加对应的处理。由于Activity在某些情况下,可能会被系统销毁,为了保险,Intent获取数据的处理,最好在onCreate、onNewIntent这两个函数中都做添加。 最后,如果我们用了FLAG_ACTIVITY_CLEAR_TOP这个flag启动Activity,当栈内已有目标Activity实例时,系统的处理会分为两种情况:
a. 只设置了FLAG_ACTIVITY_CLEAR_TOP,系统会销毁目标Activity和它之上的所有Activity,重新创建目标Activity,并不调用其onNewIntent方法。
b. 设置了FLAG_ACTIVITY_CLEAR_TOP+FLAG_ACTIVITY_SINGLE_TOP,系统只销毁之上的所有Activity,复用目标Activity,调用onNewIntent方法,效果相当于设置FLAG_ACTIVITY_NEW_TASK,也就是singleTask模式。 补充,适合使用singleInstance启动模式的Activity,基本都具有高优先级、业务逻辑的交互相对简单,也就是与其他应用的交互场景不多。而singleTask模式更适用于那些具有一定频度的交互场景的Activity,例如图库、联系人、一些第三方App问问需要启动相机拍照,然后再返回,这时候如果使用singleInstance则会始终独占一个任务栈,体验不好。换句话说,启动模式的设计,本质就是为了优化窗口返回的层次关系,改善用户体验。这其中又涉及到了Android任务栈模型,在后面文章继续分析。

(相关完整且成体系的文章可参见本人原创的开源电子书《Android系统与性能优化》,地址:https://github.com/carylake/androidnotes)

Android组件体系之Activity启动模式解析的更多相关文章

  1. Android多任务切换与Activity启动模式SingleTask之间关系的分析

    这里会以多个场景列子进行分析,在分析之前先了解一下基本的概念. Task任务:一系列Activity的集合,这些Activity以栈的形式进行排列(后进先出). 那在什么时候系统会新建一个Task任务 ...

  2. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  3. Android中Activity启动模式详解

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

  4. 【转】Android总结篇系列:Activity启动模式(lauchMode)

    [转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...

  5. AndroidのActivity启动模式

    Activity启动模式      .概念      Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否    .属性     Activity的启 ...

  6. Activity启动模式 及 Intent Flags 与 栈 的关联分析

     http://blog.csdn.net/vipzjyno1/article/details/25463457    Android启动模式Flags栈Task   目录(?)[+] 什么是栈 栈 ...

  7. 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析

    http://blog.csdn.net/vipzjyno1/article/details/25463457    在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...

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

    本文首发在我的个人微信公众号:Android开发圈 引言 关于Activity的启动模式是面试高频问题,在平时开发中,作用也不小,所以还是很有必要搞懂这一块的知识.其实之前也有写过这个主题的文章,但是 ...

  9. Activity启动模式的深入分析

    网上关于Activity启动模式的文章许多.可是看起来都千篇一律,看完之后我们都能理解这4种启动模式.只是官方api对singleTask这个启动模式解释有些争议,导致我事实上并没有真正理解这几种模式 ...

随机推荐

  1. mysql插入的时间莫名的加一秒

    1.问题描述 我获取当天最大的时间: public static Date getEndOfDay(Date date) { LocalDateTime localDateTime = LocalDa ...

  2. php 精度计算问题

    PHP var_dump(intval(0.58 * 100)); 正确结果是 57,而不是 58 浮点运算惹的祸 其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 N ...

  3. 使用Git上传文件到github

    第一次利用git连接github时往往都不会勾选Initialize this repository with a README,这样的的确确是简单了,但是如果我们需要勾选,勾选了之后应该怎么办呢?1 ...

  4. shell特殊符号及cut、sort_wc_uniq、tee_tr_split命令 使用介绍

    第6周第2次课(4月24日) 课程内容: 8.10 shell特殊符号cut命令8.11 sort_wc_uniq命令8.12 tee_tr_split命令8.13 shell特殊符号下 扩展1. s ...

  5. Linux:AWK基础

    AWK是一个强大的文本分析工具,算是Linux系统特别有用的命令了,在日志分析.文件内容分析中扮演特别重要的角色. AWK说明 简单来说awk就是把文件逐行的读入,以指定的分隔符将每行分割,分割后的部 ...

  6. spring cloud 之 -- eureka vs consul,该选择谁?

    0--前言 spring cloud的服务注册中心,该选择谁?在选择前,我们首先需要来了解下分布式的CAP定理: 所谓CAP,是指: Consistency:一致性:就是在分布式系统中的所有数据备份, ...

  7. javaSE笔记(重点部分)

    Java 基础篇 数据类型 基本数据类型 由于java是强类型语言,所以要进行有些运算的时候,需要用到类型转换. 低-----------------------------高 byte,short, ...

  8. obs命令行工具obsutil的使用测试

    test1 批量复制,目标文件夹ggggg-zyx0809/data/tmp/a0文件夹已存在,不使用flat命令,目标路径包含a0文件夹 操作 从ggggg-zyx0809/data/g_cageg ...

  9. springcloud集成kafka

    项目名称:布控预警 水平拆分出来的项目,作为一个单独的可以对外提供服务的项目 项目设计:springcloud,可以集成各个不同平台的一个作为对外提供的微服务项目 项目功能:实现各个平台和本平台之间的 ...

  10. Android Application 详细介绍

    一.先看看文档里怎么说 Base class for those who need to maintain global application state. You can provide your ...