Activity启动模式(GIF 动态演示)
本文首发在我的个人微信公众号:Android开发圈
引言
关于Activity的启动模式是面试高频问题,在平时开发中,作用也不小,所以还是很有必要搞懂这一块的知识。其实之前也有写过这个主题的文章,但是当时是随便写了一点来记录的。这次准备写的完善点。同时通过gif动态演示各种模式下的入栈出栈情况,加深对四种模式的理解。
Activity的启动模式是告诉Activity应该以什么样的方式来启动。Activity的启动模式有四种,分别是:
- standard
- singleTop
- singleTask
- singleInstance
其中standard模式是Activity默认启动模式。
设置启动模式的方式
这里有两种方式来实现设置。
在AndroidManifest清单文件中,在注册Activity组件的时候,通过"android:launchMode"标签来设置启动模式。
例如:
<activity android:name=".DemoActivity"
android:launchMode="standard"
>
</activity>这就表示"DemoActivity"的启动模式是standard模式。如果想把DemoActivity的启动模式改成singleTask,那么把"standard"改成"singleTask"即可。
我们通常会用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 动态演示)的更多相关文章
- Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- 【转】Android总结篇系列:Activity启动模式(lauchMode)
[转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...
- Activity启动模式(lauchMode)
Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些理解,在此感谢原作者. 文章地址 ...
- Android组件体系之Activity启动模式解析
本文主要分析Activity的启动模式及使用场景. 一.Activity启动模式浅析 1.standard 标准模式,系统默认的启动模式.在启动Activity时,系统总是创建一个新的Activity ...
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 Android启动模式Flags栈Task 目录(?)[+] 什么是栈 栈 ...
- 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...
- Android-3 Activity启动模式
Activity启动模式 android:launchMode="singleTask" * Standard 每次都创建一个新实例 -- TaskID不变,ActivityID改 ...
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- Activity 启动模式 FLAG
原文:https://blog.csdn.net/youhongyan/article/details/64151922 一.Activity启动模式的设置在AndroidManifest.xml文件 ...
- AndroidのActivity启动模式
Activity启动模式 .概念 Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否 .属性 Activity的启 ...
随机推荐
- MyBatis 的基本要素—核心配置文件
MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库连接信息和 MyBatis 运行时所需的各种特性,以及设置和影响 MyB ...
- Java生成PDF文件(转)
原文地址:https://www.cnblogs.com/shuilangyizu/p/5760928.html 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iT ...
- 微信小程序理解8大误区,你中招了吗?
2016年年底程序员话题中最火的是什么?莫过于微信小程序!小程序被炒得沸沸扬扬,再次证明一点,微信想让什么火,真的就能让什么火!这种能力真是全中国再也没有人有了,政府也没有.但是,小程序刚刚开始,你对 ...
- textbook references
* math 1. Teubner-Taschenbuch der Mathematik * CFD
- stm32实现iap远程固件更新
前提 想来做iap升级了,应该不是什么新手. 下面的程序需要用到一些简单的功能 串口收发数据开关总中断虽然本文标题是实现远程固件更新,但是具体远程方案本文不做详细说明,重点在于介绍mcu接收到新的固件 ...
- [bzoj1072][SCOI2007][排列perm] (状态压缩+数位dp+排列去重)
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...
- c#string类型反序列化成字典类型
c# 实现string类型转化为字典类型:黄色底纹为需要引用的dll,可以在网站下载! 下载地址:http://download.csdn.net/download/xinping_168/47107 ...
- BNUOJ 13358 Binary Apple Tree
Binary Apple Tree Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Orig ...
- POJ2528 Uva10587 Mayor's posters
The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...
- poj 2823单调队列模板题
#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N 1100000 int getmin[N],getmax[N],num[N],n,k, ...