task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task栈中的,第二个activity压入第一个 activity所在的task栈。当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示。这样,从用户角度来看,这两个activity就好像是属于同一个应用程序的,即使第二个activity是属于另外一个应用程序的。当然,这是指默认情况下。 task栈包含的是activity的对象。如果一个activity有多个实例在运行,那么栈中保存的是每个实例的实体。栈中的activity不会重新排列,只有弹出和压入操作。 一个task中的所有activity都以整体的形式移动。整个task可以被移到前台或后台。打个比方,当前的task包含4个activity–当前 activity下面有3个activity。当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上。过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task)。那个task,仍然包含着4个 activity。当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前 activity从task栈中移出后栈顶的那个activity。 刚刚描述的行为是默认的activity和task的行为。有很多方法能够改变这种行为。activity和task之间的联系,以及task中的 activity的行为可以通过intent中的标记 以及在manifest中的<activity>元素的属性 控制。其中,主要的Intent标记有:
- FLAG_ACTIVITY_NEW_TASK
- FLAG_ACTIVITY_CLEAR_TOP
- FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
- FLAG_ACTIVITY_SINGLE_TOP
- taskAffinity
- launchMode
- allowTaskReparenting
- clearTaskOnLaunch
- alwaysRetainTaskState
- finishOnTaskLaunch
默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属性同一个task。然而,每个activity可以通过<activity>中的taskAffinity属性设置单独的affinity。不同应用程序中的activity可以共享同一个 affinity,同一个应用程序中的不同activity也可以设置成不同的affinity。affinity属性在2种情况下起作用:当启动 activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记,或当activity的 allowTaskReparenting被设置成true。 FLAG_ACTIVITY_NEW_TASK 标记
当传递给startActivity()的Intent对象包含 FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity寻找与当前activity不同的task。如果要启动的 activity的affinity属性与当前所有的task的affinity属性都不相同,系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个affinity属性相同的栈中。
allowTaskReparenting属性
如果一个activity的allowTaskReparenting属性为true,那么它可以从一个task(TASK1)移到另外一个有相同affinity的task(TASK2)中(TASK2带到前台时)。
如果一个.apk文件从用户角度来看包含了多个“应用程序”,你可能需要对那些 activity赋不同的affinity值。
运行模式
activity的launchMode属性可以有四种值:
- “
standard
” (默认) - “
singleTop
“ - “
singleTask
“ - “
singleInstance
“
这4种模式可以按4种分类来区分,以下假设位于task1中的activity1启动activity2:
模式/分类 | 包容activity2的task | 一个activity是否允许有多个实例 | activity是否允许有其它activity共存于一个task | 对于新的intent,是否总是实例化activity对象 |
standard | 如果不包含FLAG_ACTIVITY_NEW_TASK标记,则activity2放入 task1,否则按前面讲述的规则为activity2选择task | 可被多次实例化,同一个task的不同的实例可位于不同的task中,每个task也可包含多个实例 | 允许 | 是的。当接收到新的intent时,总是会生成新的activity对象。 |
singleTop | 同standard | 同standard | 允许 | 已存在的activity对象,如果位于目标task的栈顶,则该activity被重用,如果它不位于栈顶,则会实例化新的activity对象 |
singleTask | 将activity2放到task1栈底 | 不能有多个实例。由于该模式下activity总是位于栈顶,所以actvity在同一个设备里至多只有一个实例 | 允许。singleTask模式的activity总是位于栈底位置。目标activity 实例已存在时,如果该实例刚好位于task栈顶,则接收intent,否则到来的intent将会被丢弃,但该可以响应该intent的那个 activity所在的task将会被移到前台。 | |
singleInstance | 同singleTask | 同singleTask | 不允许与其它activity共存于一个task。如果activity1的运行在该模式下,则activity2一定与activity1位于不同的task |
对于新到的intent,如果是由新创建的activity对象来接收,则用户可以通过返回键回到之前的activity;如果是由已存在的 activity来接收,则用户无法通过返回键返回到接收intent之前的状态。
清空栈
当用户长时间离开task(当前task被转移到后台)时,系统会清除task中栈底activity外的所有activity。这样,当用户返回到task时,只留下那个task最初始的activity了。
这是默认的情况,<activity>中有些属性可以改变这种行为。
alwaysRetainTaskState属性
如果栈底activity的这个属性被设置为true,刚刚描述的情况就不会发生。 task中的所有activity将被长时间保存。
clearTaskOnLaunch属性
如果栈底activity的这个属性被设置为true,一旦用户离开task,则 task栈中的activity将被清空到只剩下栈底activity。这种情况刚好与alwaysRetainTaskState相反。即使用户只是短暂地离开,task也会返回到初始状态(只剩下栈底acitivty)。
finishOnTaskLaunch属性
这个属性与clearTaskOnLaunch相似,但它只对单独的activity操作,而不是整个task。它可以结束任何activity,包括栈底的activity。当它设置为true时,当前的activity只在当前会话期间作为task的一部分存在,当用户退出activity再返回时,它将不存在。
另外还有一种方法能将activity强行从stack中移出。如果intent对象包含FLAG_ACTIVITY_CLEAR_TOP 标记,当目标task中已存在与接收该intent对象的 activity类型相同的activity实例存在时,所有位于该activity对象上面的activity将被清空,这样接收该intent的 activity就位于栈顶,可以响应到来的intent对象。如果目标activity的运行模式为standard,则目标activtiy也会被清空。因为当运行模式为standard时,总会创建新的activity对象来接收到来的intent对象。
FLAG_ACTIVITY_CLEAR_TOP标记常常和FLAG_ACTIVITY_NEW_TASK一起使用。用2个标记可以定位已存在的 activity并让它处于可以响应intent的位置。
启动任务(Task)
Intent filter中有”android.intent.action.MAIN
” action和”android.intent.category.LAUNCHER
” category的activity将被标记为task的入口。带有这两个标记的activity将会显示在应用程序启动器(application launcher)中。
第二个比较重要的点是,用户必须能够离开task并在之后返回。因为这个原因,singleTask和singleInstance这两种运行模式只能应用于含有MAIN和LAUNCHER过滤器的 activity 。打个比方,如果不包含带MAIN和LAUNCHER过滤器,某个activity运行了一个singleTask模式的 activity,初始化了一个新的task,当用户按下HOME键时,那个activity就被主屏幕“挡住”了,用户再也无法返回到那个 activity。
类似的情况在FLAG_ACTIVITY_NEW_TASK标记上也会出现。如果这个标记会新建一个task,当用户按下HOME键时,必须有一种方式能够让用户返回到那个activity。有些东西(比如notification manager)总是要求在外部task中启动activity,在传递给startActivity的intent中总是包含 FLAG_ACTIVITY_NEW_TASK标记。
对于那种不希望用户离开之后再返回activity的情况,可将finishOnTaskLaunch属性设置为true。
相关推荐
该资源的源码分析地址:http://blog.csdn.net/u011862733/article/details/51788634
主要介绍了Android activity堆栈及管理实例详解的相关资料,非常不错,具有参考借鉴价值,对android activity堆栈相关知识感兴趣的朋友一起学习吧
import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import com.ideacode.news.logic.IdeaCodeActivity; public class AppManager { private static Stack ...
主要介绍了Android Activity生命周期和堆栈管理的详解的相关资料,需要的朋友可以参考下
android开发工具汇集,两年开发过程中总结的有用的工具类,包含非常有用的开发工具类Activity堆栈管理、公共适配器、万能Json解析、http网络访问,图片异步加载,数据缓存,cook存储,网络状态判断,数据格式校验...
统一的上下文对象 对context进行初始化,并将当前的Activity加入到堆栈中便于管理 初始化控件绑定事件 初始化数据 统一的返回方法 设置默认的退出效果
我们知道,在Android系统中,Activity是以堆栈的形式组织...从前面Android应用程序启动过程源代码分析一文可以知道,应用程序进程中的每一个Activity组件在Activity管理服务ActivityManagerService中都对应有一个Activi
本项目是一个挺不错的新闻客户端项目源码,本项目启动引导登录注册用户中心列表显示文章分页下拉刷新文章收藏更新反馈等新闻客户端常见的功能都有,项目分层合理,代码质量较高,另外有单独的Activity堆栈式管理,...
该项目是基于安卓的大型本地化服务,遗憾的是没有服务端的源码,不过做演示的话...注释信息非常丰富,有大量可以公用出来的部分,有较完善的activity的集合堆栈管理,项目使用了自定义的对话框,本项目默认编码是GBK
本项目是一个基于安卓的大型本地化服务项目源码,但是遗憾的是没有...注释信息非常丰富,有大量可以公用出来的部分,有比较完善的activity的集合堆栈管理,项目使用了自定义的对话框,本项目默认编译版本2.3.3编码GBK
本项目是一个基于安卓的大型本地化服务项目源码,但是遗憾的是没有...注释信息非常丰富,有大量可以公用出来的部分,有比较完善的activity的集合堆栈管理,项目使用了自定义的对话框,本项目默认编译版本2.3.3编码GBK
本地服务综合服务源码是一个基于安卓的大型本地化服务项目源码...注释信息非常丰富,有大量可以公用出来的部分,有比较完善的activity的集合堆栈管理,项目使用了自定义的对话框,本项目默认编译版本2.3.3编码GBK。
运⾏ bios,加载 bootloader 到 ram,运⾏ header.s,初始化堆栈和 ram,运⾏ main.c 设置 idt 和 gdt,进⼊内核,创建 idle 进程,在系统⽂件寻找 init.rc ⽂件,并...ActivityManagerService ⽤来管理 activity 等组件
一些工具类代码块的标准代码: 单列堆栈集合对象 堆栈中销毁并移除 栈中销毁并移除所有Act对象 获取当前Act对象 获得当前Act的类名 将Act纳入推栈集合中 退出栈中所有Activity
不要在让transactions在其他的Activity生命周期函数提交,如onActivi tyResult()、onStart()和onResume() 自己在学习过程中总结的知识点 (3)Android体系结构和Android项目目录 Android是基于Linux内核的软件平台和...
使用片段的堆栈视图对话框轻松调试3.添加启动模式,startForResult等以提供类似的Activity行为4.添加onBackPressedSupport()方法以支持Fragment中的后退按钮按下监视5.添加onSupportVisible(),onLazyInitView...
本地服务综合服务源码是一个基于安卓的大型本地化服务项目源码,...注释信息非常丰富,有大量可以公用出来的部分,有比较完善的activity的集合堆栈管理,项目使用了自定义的对话框,本项目默认编译版本2.3.3编码GBK。
5.3.1 堆栈跟踪分析 127 5.3.2 对JNI的扩展检查 128 5.3.3 内存问题 130 5.3.4 strace 133 5.4 小结 134 第6章 Bionic API入门 135 6.1 回顾标准库 135 6.2 还有另一个C库 136 6.2.1 二进制兼容性 136 ...