Android中Activity启动模式探索
Android中启动模式(launchMode)分为standard, singleTop, singleTask, singleInstance四种,可通过AndroidManifest.xml文件设置某个activity的启动模式。接下来会一一探索启动模式对app行为的影响。用到的app和activity构成图如下,每次改变launchMode都只针对App2的SecondActivity:

Standard
App2内部跳转
从Main到Second再到Third再到Second,可以看到日志记录如下:
- App1跳转到App2
保持App2当前状态切到后台,运行App1从App1:Main跳转到App2:Second跳转到App2:Third,log记录如下:

可以看出,当采用standard作为启动模式时(standard也是Activity的缺省启动模式),每次启动该Activity都会产生一个新的实例,App内的Activity处于同一任务栈中;不同App间Activity调起时,被调起者与调起者也处于同一任务栈,当然,ApplicationContext是不一样的。
singleTop
App2内部跳转
从Main到Second再到Third再到Second,可以看到日志记录如下:
- App1跳转到App2
保持App2最顶端为SecondActivity切到后台,运行App1从App1:Main跳转到App2:Second跳转到App2:Third,log记录如下:

- 暂时修改App2:Second的跳转逻辑为Second->Second,即自己跳自己,log记录如下:

可以看出,当采用singleTop作为启动模式时,行为特性和standard基本一致,唯一不同的情形是,当singleTop的Activity位于后退栈顶、且该任务栈正与用户交互时,当有新的Intent要打开这个Activity不再产生一个新的实例,而是使用调栈实例同时回调栈顶实例的onNewIntent()方法将新的Intent传入。
顺便附上doc说明:
If, when starting the activity, there is already an instance of the same activity class in the foreground that is interacting with the user, then re-use that instance. This existing instance will receive a call to {@link android.app.Activity#onNewIntent Activity.onNewIntent()} with the new Intent that is being started.
singleTask
App2内部跳转
从Main到Second再到Third再到Second,可以看到日志记录如下:
- App1跳转到App2
保持App2最顶端为ThirdActivity切到后台,运行App1从App1:Main跳转到App2:Second跳转到App2:Third,log记录如下:

可以看出,当采用singleTask作为启动模式时,行为特性和singleTop基本一致,唯一不同的情形是,使用旧Activity实例的情况不再局限于“该位于后退栈顶、且该任务栈正与用户交互时”,而是只要某个Task中已存在该Activity实例,就会调起该后台运行Task,意味着调起方Task与被调起方Task并不处于同一后退堆栈。
顺便附上doc说明:
If, when starting the activity, there is already a task running that starts with this activity, then instead of starting a new instance the current task is brought to the front. The existing instance will receive a call to {@link android.app.Activity#onNewIntent Activity.onNewIntent()} with the new Intent that is being started, and with the {@link android.content.Intent#FLAG_ACTIVITY_BROUGHT_TO_FRONT Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT} flag set. This is a superset of the singleTop mode, where if there is already an instance of the activity being started at the top of the stack, it will receive the Intent as described there (without the FLAG_ACTIVITY_BROUGHT_TO_FRONT flag set). See the Tasks and Back Stack document for more details about tasks.
singleInstance
App2内部跳转
从Main到Second再到Third再到Second,可以看到日志记录如下:
可以看到,页面扭转时SecondActivity独自拥有了一个任务栈,跳到Third后Third的任务栈和Main维持一致,所以这里,我们的App2内就存在着2个任务栈。猜想一下,这个时候我们的回退栈是什么样的?出乎意料,后退时,会先以任务栈为单位后退,当前一个任务栈清空后,再进入后一个任务栈的顶端逐一移除。- App1跳转到App2
保持App2最顶端为ThirdActivity切到后台,运行App1从App1:Main跳转到App2:Second跳转到App2:Third,log记录如下:

可以看出,当采用singleInstance作为启动模式时,行为特性最特殊,被singleInstance标记的Activity会单独占有一个任务,如果已有一个Activity实例存在则不会再实例化新实例,而是把原实例所在任务唤醒到前台并回调其onNewIntent方法。
顺便附上doc说明:
Only allow one instance of this activity to ever be running. This activity gets a unique task with only itself running in it; if it is ever launched again with the same Intent, then that task will be brought forward and its {@link android.app.Activity#onNewIntent Activity.onNewIntent()} method called. If this activity tries to start a new activity, that new activity will be launched in a separate task. See the Tasks and Back Stack document for more details about tasks.
Android中Activity启动模式探索的更多相关文章
- Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- 第二课android中activity启动模式
一.标准启动模式可以用函数gettaskid得到任务的idtostring得到地址用textallcaps来设置是否全部大写应用启动自己是在任务栈里创建不同实例可以用返回来返回上一个任务栈在andro ...
- Android中的启动模式(下)
在这篇文章中,我会继续跟大家分享有关于Android中启动模式的相关知识.当然,如果对这个启动模式还不完全了解或者没有听过的话,可以先看看我之前写的有关于这个知识点的入门篇Android的启动模式(上 ...
- Android开发——Activity启动模式详解
1. Activity的启动模式 本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52054893 1.1 Standard标 ...
- Android 之Activity启动模式(二)之 Intent的Flag属性
首页博客链接关于我留言板 前面介绍了通过launchMode设置Activity的启动模式.本章接着介绍Activity的启动模式相关内容,讲解的内容是Intent与启动模式相关的Flag,以及and ...
- Android之Activity启动模式
正常模式 每个应用都有一个任务栈,任务栈中保存着已创建的Activity,先创建的Activity先入栈,栈顶是当前正在显示的activity(running),这是正常模式下的Activity的管理 ...
- Android中Activity启动过程探究
首先追溯到Activity的启动,随便启动一个自己写的demo项目,使用DDMS进行debug标记,然后在Debug中把主线程暂停,可以看到调用栈.如下图所示: 于是我们先看android.app.A ...
- android入门 — Activity启动模式
1.standard模式 standard模式是系统的默认启动方式,每次激活Activity都会创建Activity,并放在任务栈中. 系统不会在乎活动是否已经存在于返回栈中,每次启动都会创建该活动的 ...
- Android中Activity的启动模式
简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...
随机推荐
- 状压DP之Mixed Up Cows G
题目 传送们 大意 约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的.这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍.在一只混乱的队 伍中,相邻奶牛的 ...
- BZOJ2200 道路与航线 题解
题目 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 \((1 <= T <= 25,000)\),编号为\(1T\).这些城镇之间通过\(R ...
- HDU 5963 朋友 题解
题目 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双 ...
- 隐写术工具之binwalk
0x00Binwalk介绍 Binwalk是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具. 具体来说,它被设计用于识别嵌入固件镜像内的文件和代码. Binwalk使用libmagic库,因此 ...
- 赋值,逻辑,运算符, 控制流程之if 判断
赋值运算 (1). 增量运算 age += 1 # age = age + 1 print(age) age -= 10 # age = age - 10 (2).交叉赋值 x = 111 y = 2 ...
- day45 如何完全删除mysql服务
卸载mysql之后,mysql的服务无法删除 解决方案 在我们在卸载mysql后会有一些东西没有删除干净,当我们把这些内容清除干净后,服务自然就消失了 步骤一: 如果是默认安装的话 在这三个文件内都有 ...
- 论TEMP临时变量与VAR静态变量
TEMP临时变量:顾名思义,这种变量类型是临时的,没有固定的存放数据的内存空间.每次扫描结束后则清零,在下个扫描周期开始时,这个变量的值都是不确定的,一般为0.使用临时变量需要遵循一个原则:先赋值再使 ...
- (四)pandas的拼接操作
pandas的拼接操作 #重点 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 0. 回顾numpy的级联 import num ...
- java 面向对象(三十八):反射(二) Class类的理解与获取Class的实例
1.Class类的理解 1.类的加载过程:程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾).接着我们使用java.exe命令对某个字节码文件进行解释运行.相当于将某个 ...
- bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四*
bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四 题意: 平面直角坐标系有n个点,从(0,0)出发,从一个点上可以跳到所有与它横纵坐标距离都≤2的点上,求最少步数 ...