众所周知,当我们多次启动同一个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. 手机自动化测试:appium源码分析之bootstrap四

    手机自动化测试:appium源码分析之bootstrap四   Orientation是调整屏幕方向的操作 package io.appium.android.bootstrap.handler; i ...

  2. .NET程序员也学Node.js——初识Node.js

    清明在石门休了八天假,一眨眼,4月又到中旬了...看到.NET在天朝彻底沦陷而又无能为力,我开始尝试去学习一些新的东西来充实自己,我自然是打死不会去学java的,没有为什么,于是乎,最近开始学习一些前 ...

  3. struts2 之 ServletAPI

    1. 在struts2中有两种方式使用SercletAPI,一种解耦方式,一种耦合方式. 2. 解耦方式就是使用ActionContext 来实现,是完全解耦 servletAPI. ActionCo ...

  4. JS+html--实现图片轮播

    大家肯定见过某些网站一个炫酷的页面,就是图片轮播,也就是我们常说的幻灯片播放.对于初学者来说,可能会有点头疼,没关系,小李在这给大家献上自己刚刚写好的关于图片轮播的代码. 以下功能的实现用了jQuer ...

  5. Java 工具类—日期获得,随机数,系统命令,数据类型转换

    package tems; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; ...

  6. [.NET] 《Effective C#》快速笔记(三)- 使用 C# 表达设计

    <Effective C#>快速笔记(三)- 使用 C# 表达设计 目录 二十一.限制类型的可见性 二十二.通过定义并实现接口替代继承 二十三.理解接口方法和虚方法的区别 二十四.用委托实 ...

  7. [KISSY5系列]KISSY5安装使用(一)

    本文将从零开始安装KISSY环境 一.安装nodejs 从nodejs网站下载nodejs安装 地址: https://nodejs.org/en/download/ 二.下载KISSY 下载地址:  ...

  8. 人生苦短,我用Python

    Life is short, You need Python. 工作中常常要用到脚本来完成许多重复性的工作,刚开始是查数据库的时候,也曾用shell 来写脚本,但终于还是觉得shell太艰涩, 一行命 ...

  9. 蓝桥杯-买不到的数目-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  10. [PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索

    标题起的太大了,都是骗人的.最近使用PHP实现了简单的网盘搜索程序,并且关联了微信公众平台.用户可以通过公众号输入关键字,公众号会返回相应的网盘下载地址.就是这么一个简单的功能,类似很多的网盘搜索类网 ...