Android任务与返回堆栈 (Tasks and Back Stack)

本文参照自:http://developer.android.com/guide/components/tasks-and-back-stack.html

一个应用通常会包含有多个Activity,而一个Activity通常会设计成可以启动另一个Activity。例如在邮件的应用中,用户可以启动一个Activity以显示邮件列表,然后在通过这个Activity启动一个浏览邮件的Activity。除此以外,Activity还可以启动不属于同一个应用的Acvitity,但是这个Activity使用起来仿佛就像是在同一个应用中一般(因为按下返回键就可以返回原来的那个应用)。

由此,Android提出了一个“任务”(Task)的概念。

任务”(Task)定义为用户为了完成一个特定的工作时与之交互的一系列Activity。这些Activity被安置在一个堆栈中,也就是“返回堆栈”(Back Stack)

两者关系可参考下图:


Task一般存在两种状态:foreground 和background。当用户启动一个新的Task或者按下HOME后,当前的Task会转到background状态。当进入到background状态后,该Task的所有Activity都进入stop状态,但是,这个Task的Back Stack仍然保留。如下图所示:



任务管理

Android默认将一系列按照顺序启动的Activity归并到一个Task和Back Stack之中,你不需要担心这些Activity在Task中是如何关联和它们在Back Stack中的存在方式。但是,如果你想建立自己的行为方式的话,这种默认的管理就不能满足要求了。例如,你打算在一个应用中启动另外一个Task;或者,你在启动Activity时,打算唤醒一个已经存在的Activity实例,而不是初始化一个新的实例;抑或,你打算在离开时杀死所有的Activity。

这时,你就需要定义自己的任务管理方式了。

一. 定义启动模式

启动模式(Launch mode)定义了你的Activity启动时它与当前任务的关联模式。你可以通过manifest 文件和Intent flag来定义自己的启动模式。

使用manifest文件

当你在manifest文件中声明Activity的时候,可以通过<Activity>元素的launchmode标签定义自己的启动模式。launchmode标签可以取下面四个值:

"standard"

默认模式。在Activity启动时,系统将会生成一个新的实例,并将其绑定到当前任务中。这个Activity可以被多次初始化,每个实例可以归属于不同的任务,或者,一个任务可以拥有该Activity的多个实例。

“singleTop”

与“standard”相似,除了当该Activity的实例已经存在于当前任务的栈顶时,系统将会通过调用onNewIntent()方法把Intent导航到该实例,而不是生成一个新的实例。

“singleTask”

系统将会生成一个新的Task,并将该Activity的实例作为新Task的根。但是,如果该Activity的实例已经存在时,系统将会调用onNewIntent()的方法把Intent导航到该实例。同一时间只允许有一个实例存在。

“singleInstance”

跟“singleTask”一样,除了hold住这个Activity的Task只能拥有这一个实例,不能拥有别的Activity 的实例。

使用Intent flags

在启动Activity时,可以在intent中设置一些标志,实现与manifest文件的效果。

FLAG_ACTIVITY_NEW_TASK

等同于“singleTask”。

FLAG_ACTIVITY_SINGLE_TOP

等同于“singleTop”。

FLAG_ACTIVITY_CLEAR_TOP

如果该Activity的实例已经存在于任务中时,将会杀死所有在其上的其他Activity。

FLAG_ACTIVITY_CLEAR_TOP通常会与FLAG_ACTIVITY_NEW_TASK结合一起使用。

二. 处理相似性(affinities)

“affinity”是指一个Activity倾向于属于哪一个Task。默认情况是把同一个应用的所有Acivity都归属于一个Task,不过你可以通过manifest 文件中的taskAffinity参数修改affinity。

Affinity会在两种情况下使用到。

1.当启动Activity的Intent包含有FLAG_ACTIVITY_NEW_TASK标志时

2.当Activity的“allowTaskReparenting”参数设置为true时。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值