Android活动和任务(Activities and Tasks)

默认行为:

task是一组Activity实例组成的栈,无法设定一个task的属性而不管它的Activity,一个task的所有属性值是在底部的Activity里设置的。一个task里的所有Activity作为一个整体运转。整个task(整个Activity堆栈)可以被送到前台或者被推到后台。假设一个正在运行的task中有四个Activity——正在运行的Activity下面有三个Activity,这时用户按下HOME键,回到应用程序启动器然后运行新的应用程序(实际上是一个新的task),那么当前的task就退到后台,新开启的应用程序的root Activity此时就显示出来了;一段时间后,用户又回到应用程序启动器,又重新选择了之前的那个应用程序(先前的那个task),那么先前的那个task此时又回到了前台了,当用户按下BACK键时,屏幕不是显示刚刚离开的新开启的那个应用程序的Activity,而是移除回到前台的这个task的栈顶Activity,将这个task的下一个Activity显示出来。

这种默认行为时可以修改的,Activity和task的关系,以及task中Activity的行为,是受启动该Activity的Intent对象的标识和在manifest文件中的Activity的<activity>元素的属性共同影响的。activity 和任务的联系、任务中activity的行为方式都被启动那个activity的Intent 对象中设置的一系列标记和manifest文件中那个activity 中的<activity>元素的系列属性之间的交互所控制。无论是请求发出者和回应者在这里都拥有话语权。

在这种情况下,主要的Intent控制标识有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

重要的<activity>属性有:

taskAffinity

launchMode

allowTaskReparenting

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

affinity和新的tasks(Affinities and new tasks)

默认的,一个应用程序中的所有Activity都有血缘关系——就是都属于同一个task的。但是,可以通过<activity>元素下的taskAffinity属性来为某个Activity设置单独的affinity。定义在不同应用程序中的Activity可以共享一种affinity,或者一个应用中的不同的Activity可以定义不同的affinity。affinity满足以下两种情况时起作用:一是当启动Activity的 Intent对象包含有FLAG_ACTIVITY_NEW_TASK标志时,二是当Activity的allowTaskReparenting属性设置为“true”。

FLAG_ACTIVITY_NEW_TASK标志位

如果传递给startactivity()的Intent对象含有FLAG_ACTIVITY_NEW_TASK标志,系统就会寻找一个新的task来装这个新的Activity。如果已经有一个task和这个新的的Activity有相同的affinity,那么就把这个新的Activity放进那个task里,如果没有,就启动一个新的task。

allowTaskReparenting属性

如果一个Activity的allowTaskReparenting属性设置为true,这个Activity就可以从启动时的那个task移动到一个和它有相同affinity的前台的一个task里去。

比如,假设现在有一个用于天气预报的Activity被定义在一个旅行的应用程序里,他和这个应用里的其他Activity有相同的affinity(默认的affinity),并且允许重定父级。现在你自己的应用程序中有一个Activity启动这个天气预报的Activity,那么天气预报Activity就会移动到你的Activity所在的task里,当旅行的应用程序回到前台时,天气预报Activity重新回到以前的那个task并显示。如果说没有设置这个属性,或者这个属性设置为false,那么一个应用里的Activity调用另一个应用里的Activity时,系统是为另一个应用里的Activity创建一个实例,然后放到同一个task里,但是如果设置了allowTaskReparenting为true,那么另一个应用里的Activity是可以在不同的task间来回移动的,那个task在前台就移动到那个task里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值