你能够使用<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分配不同的亲缘关系让它跟每个应用进行关联。