Android 任务和回退堆栈---处理亲缘关系

亲缘关系是指Activity愿意属于哪个任务。默认,来自同一个应用程序的所有的Activity彼此有一个亲缘关系。因此,默认情况下在同一个应用程序中的所有Activity都应该属于同一个任务。但是,你能够给一个Activity修改默认的亲缘关系。Activity被定义在不同的应用程序中能够共享一个亲缘关系,或者Activity被定义在同一个应用程序中能够跟不同任务的亲缘关系进行关联。

你能够使用<activity>元素的taskAffinity属性来修改任意给定的Activity的亲缘关系。

taskAffinity属性需要一个字符串值,它必须是在<manifest>元素中声明的唯一的默认包名,因为系统要使用这个名字来给应用程序标识默认任务的亲缘关系。

亲缘关系应用于以下两个方面:

1.  当启动Activity的Intent中包含了FLAG_ACTIVITY_NEW_TASK标识时。

默认情况下,一个新的Activity是在调用startActivity()方法的Activity的任务中被启动。它被放到与调用者相同的回退堆栈的上面。但是,如果如果传递个startActivity()方法的Intent包含了FLAG_ACTIVITY_NEW_TASK标识,系统就会寻找一个不同的任务来给安放这个新的Activity。通常这是一个新的任务。但是,如果有一个既存的任务跟这个新的Activity有相同的亲缘关系,它就不会启动一个新的任务,而是在这个有亲缘关系的任务中启动这个Activity。如果没有,就启动一个新的任务。

如果这个标识导致一个Activity开启了一个新的任务,并且用户按下Home按钮离开了它,那么就必须给用户提供一些返回调用这个Activity的任务的方法。某些实例(如通知管理器)总是在外部任务中启动Activity,不会把这个Activity作为它们自己的一部分,因此它们总是把FLAG_ACTIVITY_NEW_TASK标识放到Intent中传给startActivity()方法。如果你有一个能够通过外部实体调用的Activity,就可能使用这个标识,那么就要注意,用户会有一种独立的方式返回到启动它的那个任务,如启动图标(这个任务的根Activity有一个CATEGORY_LAUNCHER的Intent过滤器,详细请参阅启动任务(Starting a task)章节)。

2. 当Activity的allowTaskReparenting属性被设置为“true”时

在这种场景中,这个Activity能从启动它的任务中转移到跟它有亲缘关系的任务中,这种转移发生在跟它有亲缘关系的任务显示在前台的时候。

例如,假设一个报告选择城市的天气条件的Activity被定义成一个旅游应用程序的一部分,它跟同一个应用程序中的其他Activity有着相同的起源关系(默认的应用程序亲缘关系),并且允许使用re-parenting这个属性。当应用中的一个Activity启动了天气预报的Activity,它最初跟你的Activity属于同一个任务。但是,当这个旅游应用程序显示在前台时,这个天气预报的Activity又会被重新关联到天气预报的任务,并且在这个任务中显示。

提示:如果一个.apk文件中从用户的角度看包含了多个应用程序,那么就可能想要使用taskAffinity属性给Activity分配不同的亲缘关系让它跟每个应用进行关联。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值