知识总结: Activity的四种启动模式
通常情况下,一个应用有一个Task,这个Task就是为了完成某个工作的一系列Activity的集合。而这些Activity又被组织成了堆栈的形式。当一个Activity启动时,就会把它压入该Task的堆栈,而当用户在该Activity中按返回键,或者代码中finish掉时,就会将它从该Task的堆栈中弹出。然而,事实上我们的需求远没有我们想的那么简单。有时候,你可能希望在开启一个Activity时,重新开启一个Task;有时你可能希望将已经存在的一个Activity放到栈顶,而不是重新创建一个等等。
标识Activity任务栈名称的属性:TaskAffinity,默认为应用包名。
Android为了使我们能够打破默认的堆栈的先后出的模式,提供了两个种方式:一种是在AndroidManifest.xml定义Activity时指定它的加载模式,另一种是在用Intent开启一个Activity时,在Intent中加入标志。如果两种方式都用了,则后者的优先级更高。两种方式的差别在于,前者在于描述自己,向别的Acttivity等声明你们如何来加载我;而后者则是动态的,指出我要求你(要启动的Activity)如何来加载。
Android为我们定义了四种启动模式,分别是:standard、singleTop、singleTask和singleInstance。
1.standard加载模式下,当一个Task请求加载一个Activity时,该Task直接实例化这个Activity,并把它放到栈顶,不管之前栈中是否存在该Activity的实例。
2.singleTop加载模式时,当一个Task请求加载一个Activity时,如果该Task对应的栈的栈顶就是一个Activity的实例,那么,它便不会重新创建,而是调用onNewIntent。如果该Task对应的栈中Activity的实例存在,但不是在顶部,那么该Activity依然要重新创建。简单的说就是获得焦点的Activity(当前的Activity)不能再激活一个自己的实例呗。singleTop模式下的Activity可以被实例化多次,但是不可以多个相同的Activity的实例重叠。
3.singleTask加载模式时,当一个Task请求加载一个Activity时,如果该Task对应的栈中有一个Activity的实例,那么它便不会重新创建。如果已经实例化,会将Task中其上的Activity实例销毁后,调用onNewIntent。一句话,singleTask模式下的Activity,在自己的Task里只有一个实例,并且启动时不允许其他Activity凌驾于自己之上
4.在singleInstance这个模式下,当一个Task请求加载一个Activity时,如果所有Task的栈中有一个Activity的实例,那么,它便不会重新创建。如果所有Task的栈中没有一个Activity的实例,那么该Activity的实例被创建,并独占一个新的task,其它activity不能存在这个task里。
实例:
现在ATask的栈元素为A-B-C-D(D在栈顶),
这时候给D发起intent(D,D),
如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D;
如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D;
如果这时候D发起intent(D,B)的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B;
如果B的launchmode是” singleTask”,栈状态变为A-B;
如果这时候D发起intent(D,E),E的launchmode是” singleInstance”,如果所有栈中不存在E,那么会产生一个新的Task栈,放入E,ATask的栈状态仍为A-B-C-D
知识总结: Activity的四种启动模式的更多相关文章
- Activity的四种启动模式
Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. ...
- Activity的四种启动模式-图文并茂
1.对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例. 例如A启动A,A再接着启动A,A继续启动A,然后再分别出栈,如图所示 ...
- Activity的四种启动模式和onNewIntent()
转自:http://blog.csdn.net/linghu_java/article/details/17266603 Android中Activity启动模式详解 在Android中每个界面都 ...
- 详解Activity的四种启动模式
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Ac ...
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...
- Activity的四种启动模式任务栈图解
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 今天带来另一篇Activity的文章--Activity的四种启动模式.该篇文章,会以图文讲解的方式带你彻底掌握Activity的启动 ...
- 安卓基础之Activity的四种启动模式
Activity的四种启动模式 Activity的启动模式在清单文件中配置: <activity ... activity:lauchMode:"..."; //有四种模 ...
- Android 关于Activity的四种启动模式的简单介绍
Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standar ...
- Android学习笔记四:activity的四种启动模式
Activity有四种启动模式:standard,singleTop,singleTask,singleInstance. 1.standard:标准启动模式 默认模式,这个模式下启动的Activit ...
随机推荐
- JavaScript高级程序设计(八):基本概念--操作符
操作符包括:算术操作符.位操作符.关系操作符和相等操作符. 一元操作符 1.只能操作一个值得操作符,即递增和递减操作符: 2.递增(++)和递减(--)操作符包括:前置型和后置型.前置型位于要操作的变 ...
- WPF 中,如何使用自定义的resources
第一步,先自己自定义一个Resources 1.新建一个xaml文件,在其中自定义好自己的Resources 这个Resource 的根节点是 <ResourceDictionary xmlns ...
- OC2_数组操作
// // main.m // OC2_数组操作 // // Created by zhangxueming on 15/6/11. // Copyright (c) 2015年 zhangxuemi ...
- 给div设置一个关闭按钮.
造轮子好难. 用惯了框架提供的组件,某天自己要做个伪组件(或者在他人创建的页面效果上添加新功能)会发现很难. 所以,碰到了,就一定要做下记录.以供日后查阅. 如图,弹出DIV右上角的关闭按钮是我此次添 ...
- EL表达式 入门
为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. JSP EL语言定义 E L(Expression L ...
- 08_rlCoachKin自主编译,调试
为了知道参数的意思,以及为了从头建立一个项目,我从使用QTCreator来单独建立项目(当然也可以直接使用源代码中建立好的VS项目). 其实也推荐 VS2010调试 如果是用自带的VS项目,那么我们需 ...
- Windows和Linux下查看Apache、MySQL、PHP版本
# Windows查看Apache版本: 使用命令:httpd -v # Linux查看Apache版本: 使用命令:apachectl -v # Windows查看MySQL版本: 使用命令:mys ...
- Linux之在CentOS上一次艰难的木马查杀过程
今天朋友说他一台要准备上线的生产服务器被挂马,特征ps命令找不到进程,top能看到负载最高的一个程序是一个随机的10位字母的东西,kill掉之后自动再次出现一个随机10位字母的进程. 我让他关闭这个机 ...
- Unix/Linux之命令备忘录
ps:是显示瞬间进程的状态,并不动态连续 kill:用于杀死进程或者给进程发送信号 // 在Linux下查看所有java进程命令 ps -ef | grep java: // 停止所有java进程命 ...
- Centos 6.4 /usr/src/kernels 目录为空解决方法
/usr/src/kernels 目录下是Linux的内核源码,如果其为空,则需要安装安装 kernel-headers 和 kernel-devel包