本文首发在我的个人微信公众号:Android开发圈

引言

关于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和返回上一层的入栈,出栈表现。

standard Mode

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

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

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

singleTop Mode

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

当栈顶元素不是A时:

当栈顶元素是A时:


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


singleTask Mode

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

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

流程图如下:

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 动态演示)的更多相关文章

  1. Android中Activity启动模式详解

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

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

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

  3. Activity启动模式(lauchMode)

    Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些理解,在此感谢原作者. 文章地址 ...

  4. Android组件体系之Activity启动模式解析

    本文主要分析Activity的启动模式及使用场景. 一.Activity启动模式浅析 1.standard 标准模式,系统默认的启动模式.在启动Activity时,系统总是创建一个新的Activity ...

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

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

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

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

  7. Android-3 Activity启动模式

    Activity启动模式 android:launchMode="singleTask" * Standard 每次都创建一个新实例 -- TaskID不变,ActivityID改 ...

  8. Android Activity 启动模式详解

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

  9. Activity 启动模式 FLAG

    原文:https://blog.csdn.net/youhongyan/article/details/64151922 一.Activity启动模式的设置在AndroidManifest.xml文件 ...

  10. AndroidのActivity启动模式

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

随机推荐

  1. 阿里云创建CentOS系统设置

    1 首先设置你购买的云盘配置,例如cpu,内存,磁盘类型.容量,网络类型等 2.阿里云可以使用浏览器进行远程shell连接 首先需要输入远程密码,第一次连接的时候会提示 一定要牢记 输入密码后进入sh ...

  2. shoppping collection

    personal shopping collections shop Table of Contents 1. phone network 2. band share 3. Motorcycle He ...

  3. 【08】AngularJS XMLHttpRequest

    AngularJS XMLHttpRequest $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. 读取 JSON 文件 以下是存储在web服务器上的 JSON 文件: ...

  4. node.js与HTML5离线缓存

    最近正学到HTML5的离线缓存,却看到需要配置服务器.一下子就懵了,毕竟服务器的有关配置一般是很复杂的,而node.js的服务器是自己的代码生成的,这下要怎么配置?在网上搜索了很久,都没用关于node ...

  5. SCOI2010第一场

    NOI2010全国青少年信息学奥林匹克竞赛 四川代表队选拔赛 第一场 题目名称 幸运数字 游戏 股票交易 英文代号 luckynumber game trade 时限 2秒 2秒 2秒 输入文件 lu ...

  6. 【Storage】IBM DS8100开机及配置过程

     ************************************************************************ ****原文:blog.csdn.net/cla ...

  7. IOS开发之block应用

    非常长时间都是在学习各位大神的力作,并汲取了不少养料,在此一并谢过各位大神了. 当然了.好东西是要跟大家一起分享的,近期发现了几个很不错的个人网站,都是介绍IOS开发的.当中有唐巧.破船之长.池建强. ...

  8. BAT 前端开发面经 —— 吐血总结 前端相关片段整理——持续更新 前端基础精简总结 Web Storage You don't know js

    BAT 前端开发面经 —— 吐血总结   目录 1. Tencent 2. 阿里 3. 百度 更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘, ...

  9. apache在windows下的命令安装与报错解决

    1.在windows下能够通过执行apache的exe文件就能够,但当我们打包的时候,就须要命令来安装apache.apache在windows下用命令下的安装为: apache.exe -k ins ...

  10. mybatis Generator生成代码及使用方式(转载)

    转载自:http://www.cnblogs.com/fengzheng/p/5889312.html 文章很棒,很不错,转了.