Android Activity 启动模式和任务栈
在了解了基本的Activity的生命周期后,我们能够很好的在一个Activity上面做相关的业务。但是这是不够的,因为Android通过任务栈来保存整个APP的Activity,合理的调度任务栈才能够提供良好的用户体验。而栈的结构,相信大家都知道——先进后出的线性表,新启动的Activity会位于任务栈的栈顶,处于活动的状态,其他的Activity虽然不在活动状态了,但是依然保留在任务栈中,处于停止的状态(也就是onStop被触发了,但是onDestory没有被触发)。
一般情况下,返回键和调用finish方法会移除顶部的Activity,然后让后面的Activity恢复活动,但是这也就是在一般情况下。AndroidMainfest.xml文件下面的属性 android:LaunchMode或者Intent的flag能够打破这种状态。
下面会先介绍一下AndroidMainifest的启动模式
- standard
- singleTop
- singleTask
- singleInstance
1.standard
默认的启动模式,如果不指定Activity的启动模式,则使用这种方式来启动Activity,这种模式下,每次启动都会创建新的实例,创建后的Activity都会覆盖在原Activity上面.下图展示的就是此启动模式下的栈的状态:

2.singleTop
如果指定启动Activity为singleTop模式,启动时会判断当前栈顶是不是要启动的Activity,如果是则不创建新的Activity而是直接引用这个Activity,如果不是则创建新的Activity,这种模式通常适用于接受到消息后显示的界面。这种启动模式不会创建新的Activity,但在启动Activity的时候调用onNewIntent()方法。举个例子来说,当任务栈中有A、B、C三个Activity,而C的启动模式是singleTop的,那么在此启动C的时候,系统就不会创建C的实例了,而是会调用C的onNewIntent方法,当前任务栈中依然是A、B、C三个Activity。
3.singleTask
singleTask模式与singleTop类似,不过singleTop是检测栈顶是否是需要启动的Activity,而singleTask则是检测整个栈中是否存在当前需要启动的Activity,如果存在,就将该Activity置于栈顶,并将改Activity以上的Activity都销毁。不过这里是指在同一个App中启动这个singleTask的Activity,如果其他程序以singleTask模式来启动这个Activity,那么将创建一个新的任务栈。不过需要注意的是:如果启动的模式为singleTask的Activity已经在后台的一个任务栈里面了,那么启动后,后台的这个任务栈将一起被切换到前台,如图:

通过查看上图,我们也可以知道,使用这个模式创建的Activity不是在新的任务栈中被打开,就是将已打开的Activity切换到前台。使用的环境,读者自己去领悟吧,在这里就不多赘述了。
4.singleInstance
声明为singleInstance的Activity会出现在一个新的任务栈里面,这个任务栈只存在这一个Activity。此Activity被创建后是被共享的,也就是说再次激活此Activity的时候是不需要创建实例的,而是直接调出此Activity。
注意:如果在一个singleTop 或者 singleInstance 的ActivityA中通过startActivityForResult()方法来启动一个ActivityB,那么系统将直接返回Activity.RESULT_CANCELED而不会再去等待返回,这是由于系统在Framework层做了对这两种启动模式的限制,因为Android开发者认为不同的Task中间,默认是不能传递数据的,如果一定要传递,那就只能通过Intent。
除了在AndroidMainfest声明启动方式,也可以通过Intent来声明此次启动Activity的方式。 还有一些在AndroidMainfest里面做清理任务栈和其他的操作的标签,通过看相关的API文档能够很容易的了解到。这里不做过多的描述。还有就是,了解Activity的任务栈了,但是不要滥用,一定要根据项目的实际需求来使用任务栈.
Android Activity 启动模式和任务栈的更多相关文章
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- AndroidのActivity启动模式
Activity启动模式 .概念 Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否 .属性 Activity的启 ...
- Android Activity启动模式
<activity android:name=".MainActivity" android:launchMode="singleTask"> &l ...
- 详解Android Activity启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- android:Activity启动模式之singleTask(一)
先看一下standard启动模式的说明: 仅仅有一个实例.在同一个应用程序中启动他的时候.若不存在此Activity实例.则会在当前栈顶创建一个新的实例.若存在,则会把栈中在其上的其他Activity ...
- android Activity启动过程(三)从栈顶Activity的onPause到启动activityon的Resume过程
ActivityStack.startPausingLocked() IApplicationThread.schudulePauseActivity() ActivityThread.sendMes ...
- android activity 启动模式
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 1,标准的, 2,单个 顶部 3,单个 任务 4,单个 实例 标准的 就是 每启动一次这 ...
- Android的启动模式(下)
Android中的启动模式(下) 在这篇文章中,我会继续跟大家分享有关于Android中启动模式的相关知识.当然,如果对这个启动模式还不完全了解或者没有听过的话,可以先看看我之前写的有关于这个知识点的 ...
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 Android启动模式Flags栈Task 目录(?)[+] 什么是栈 栈 ...
随机推荐
- Openlayers+Geoserver(一):项目介绍以及地图加载
项目验收完,趁着事情不是很多,对这个项目进行梳理.我主要负责地图模块,网站其他模块主要有两个,一个是报表,主要是100多张报表,技术没有难度,主要是工作量的问题.另一个是数据的校验,就是 ...
- 【Visual Lisp】两种出错处理方式
两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;============================================================= ...
- html 页面中显示单行省略号
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- hdu 1166 敌兵布阵(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始 ...
- XStream学习笔记
XStream 所需jar包: xstream-1.3.jar xpp3_min-1.1.4c.jar xmlpull-1.1.3.1.jar 目录: 1.注解去除,标签中带有包名的节点 2.注解修改 ...
- iOS项目旋转控制
iOS6的旋屏控制技巧 在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController ...
- List 源码分析笔记
List Class Diagram: 笔记一: 1.Iterable 接口只定义一个iterator()方法. Iterator 接口有hasNext, next, remove方法. ListIt ...
- dom解析xml
<?xml version="1.0" encoding="UTF-8"?><ShowList> <Movie> < ...
- Mac OS X双系统变回虚拟机
Mac OS X双系统变回虚拟机 自从装了双系统后,感觉不要太好,装了虚拟机就开始有工作的干劲了.不妙的是,我在Win7系统里并没有装office,用不了word文档就写不了笔记和总结.我不太想在Wi ...
- iOS CGContextRef画图时的常用方法
UIView的drawRect方法 CoreGraphics绘图 综述:描述系统会调用UIView的drawRect方法,所以coreGraphics的所有实现代码放在该函数内,setNeedsDis ...