android 任务栈管理器,【Android】任务和返回栈(task and back stack)

Task是指将相关的Activity按照先进后出的规则组合到一起,以Activity

Stack的方式进行管理。从用户体验上讲,一个“应用程序”就是一个Task,但是从根本上讲,一个Task可以由一个或多个Android

Application组成的。例如:你想在发送短信时,拍一张照并作为彩信发出去,这时你首先停留在短信应用程序的的Acitivity上,然后跳转到

Camera应用程序的Activity上,当完成拍照功能后,再返回到短信应用程序的Activity。这实际上是两个Android

Application协同合作后完成的工作,但为了更好的用户体验,Android平台加入了Task这么一种机制,让用户没有感觉到应用的中断,让用户感觉在一“应用程序”里就完成了想完成的工作。

用户点击图标打开一个app时,该app的task会被移到前台显示。如果当前没有该app的task,系统将会新建一个task并在其中运行Main activity。

一个activity(A)打开另一个activity(B),B将会被置于栈顶并显示,A仍然处于栈中,系统会保存它的状态。 如果按下返回键,当前的activity将被弹出栈并destroy掉,前一个activity被resume并重新显示(还原stop前的UI显示)。

下图表示2个activity切换过程该栈的状态。

92342270_1.png

用户可通过BACK键让task栈中的activity依次弹出,当最后一个activity也被弹出后,该task便不再存在。

如果HOME键被按下,从当前app回到桌面,该app的Task会被移到后台,后台的task所属的所有activity都是stop状态,且back stack依然存在——这个task其实只是失去了和用户交互的焦点。

多个task可以同时存在后台,但是系统也会停止一些activity来释放空间,导致activity的状态丢失。

92342270_2.png

Back stack中的activity不会被重新排位,如果同一个activity能被其他多个activity启动,这个activity都会创建新实例推入栈中:

92342270_3.png

总结Activity和task的默认行为:

Activity A

启动了

Activity B

A

会被

stop

,但状态仍然保存(

UI

,如活动条的位置,

EditText

输入的文字),从

B

返回,

A

resumed

并恢复之前的状态。

点击HOME键返回桌面,当前的task被移到后台,系统会保存task中每一个activity的状态;直到用户点击

app

图标返回,该task被移回前台,resume栈顶的activity

BACK键会导致当前的activity从栈顶弹出并被destroy

,该activity状态不会再被保存,前一个activity移到栈顶。

Activity能被实例化多次,包括其它task启动它。

管理Task

Android管理task和back stack的默认行为:activity在同一个任务中创建并置于先进后出的栈中。如果这种默认的行为不能满足我们的app设计,如:为一个activity创建一个新任务(而不是在相同的任务

中),或者启动activity时直接打开已存在的实例(而不是直接在栈顶创建新实例),又或者在用户离开这个task的时候清空除了栈顶以外的全部

activity。Android提供了一些属性和flag让coder来指定管理的方式。

Intent 也有相关的flag:

android建议一般的app都不要干涉系统按照默认的方式管理activity和task。如果coder必须指定非默认的管理的方式,最好确定这种效果能符合用户的预期。

定义Launch Mode

对 的launchMode可以指定以下值:

Use Cases

Launch Mode

Multiple Instances?

Comments

Normal launches for most activities

"standard"

Yes

默认行为。每次启动一个activity,系统都会在当前task新建一个实例。

Normal launches for most activities

"singleTop"

Conditionally

如果要启动的activity已经存在于栈顶,则会将intent传递给该activity的onNewIntent()方法。注意,不会创建新的activity实例对象。

如果栈顶不是要启动的activity,则会创建该activity的新实例,即singleTop只检查栈顶元素,这样栈中可能包含多个该activity的实例对象。

Specialized launches

(not recommended for general use)

"singleTask"

No

系统会创建一个新的任务(task)并将目标activity作为这个任务的根元素。

注意,如果目标对象已经存在于一个独立的栈中,系统会将intent对象转发(route)到目标activity的onNewIntent()方法中,而不会新建任务。

注意,这个情况在notification中是很有用的。

Specialized launches

(not recommended for general use)

"singleInstance"

No

和"singleTask"类似,为目标activity新建一个task,且该task中不会再存放其它activity,只存放目标activity一个。

SingleTask的例子:浏览器的browser

activity设置了SingleTask只运行在它自己的task中,如果Browser的task现在正在后台当中(task

B),而我们的app(task A)的正要打开这个activity,这个task就会被直接移到前台接收我们的intent。

返回键只会将界面返回到当前task的下一个activity,所以Task B回到前台后,返回键会先作用在Task B中,直到最后一个activity被弹出,才会回到我们的Task A栈顶的activity。

92342270_4.png

注意:launchMode能被Intent 的flag覆盖。

使用Intent 标志

FLAG_ACTIVITY_NEW_TASK: 等同于 singleTask

FLAG_ACTIVITY_SINGLE_TOP: 等同singleTop

FLAG_ACTIVITY_CLEAR_TOP: 如果该activity已经运行在当前task中,intent指定启动这个activity时,task中在它上面的activity都会被destroy,直到指定的activity位于栈顶,然后它的onNewIntent()被调用。

Affinity

affinity用于指定activity所属的task。默认状态下,一个app中的所有activity都有相同的affinity,所以它们会运行

在同一个task。而通过的taskAffinity属性可以指定affinity。

taskAffinity要用中定义的唯一包名来取值,系统通过包名定位到app的默认task。

taskAffinity在以下2种情况中发生作用:

使用FLAG_ACTIVITY_NEW_TASK启动一个activity。如果该activity指定了taskAffinity,系统会将

activity实例置于指定的task中。

注意的是,此情况下如果用户点击HOME键,必须要确定有办法能回到那个task中!(例如task所属的app在launcher有自己icon)

activity 设置了 allowTaskReparenting = “true”。 当activity所在的task被移到前台时,该activity会被移动到affinity指定的task中。

清理back stack

如果用户离开一个task很长时间,系统会清理栈顶以下的activity,这样task被从新打开时,栈顶activity就被还原了。coder同样可以通过属性改变这种行为:

alwaysRetatinTaskState: 如果当前栈顶的activity设置此属性为true,task中的所有activity都会被保留状态。

clearTaskOnLaunch:如果当前栈顶的activity设置此属性为true,行为则与alwaysRetatinTaskState相反,每次离开并重新该task,栈顶下的所有activity都会被清除,用户返回task时永远都是activity初始化的状态。

finishOnTaskLaunch: 与clearTaskOnLaunch 相似,不过只作用于单个activity,不影响整个task。即使是栈顶的activity,也会生效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值