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 目录(?)[+] 什么是栈 栈 ...
随机推荐
- 一些比较常用的Linux命令
我有一些是我是参考别人的,忘记是谁了,在这里要感谢一下ta. #命令格式就是就是由命令+空格+一些命令用法的选项(可以选择多个用法)+空格+/+目录名或者文件名,有些是直接打命令就可以了,比如ls - ...
- JavaScript-location:封装当前窗口正在打开的url的对象
location:封装当前窗口正在打开的url的对象 href:完整的url protocol:协议 host:主机名+端口 hostname:主机名 port:端口 pathname:路径 hash ...
- SQL事物隔离级别
标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...
- input文本框去除单击时的边框的方法
前端开发写的input文本框标签后单击时可以看到有边框,去除边框的方法: input{ outline:medium; }
- java的 new 关键字
java的new关键字想必大家都知道这是实例化一个对象.没错,也是为新对象分配内存空间. 比如new MyDate(22,7,1964)这样一个案例,他的完成需要四部: 一.为新对象分配内存空间,将M ...
- 使用Inno Setup函数修改文件内容
0.inno打开文件操作&字符串操作所需函数原型及解释 function LoadStringsFromFile(const FileName: String; var S: TArrayOf ...
- (转载)JAVA线程池管理
平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...
- Nodejs学习路线图
前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个.和所有人一样,我也从Web开发开始,然后到包管 理,再到应用系统的开发,最后开源自己的Nodejs项目 ...
- php+mysql+apache+nginx
http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 安装mysql rpm -qa | grep mysql ...
- Intellij IDEA Java web 项目搭建
Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...