Activity TaskAffinity分析

注:内容来自任玉刚的《Android开发艺术探索》

在singleTask启动模式中,说到某个Activity所需的任务栈,什么是Activity所需的任务栈呢,要从一个参数说起:TaskAffinity,可以翻译为任务相关性。这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。当然,我们可以为每个Activity都指定TaskAffinity属性,属性值不能跟包名相同,否则就相当于没有指定。

TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下没有意义。另外,任务栈分为前台任务栈和后台任务栈,后台任务栈里面的Activity处于暂停状态,用户可以通过切换后台任务栈再次切换到前台。

当TaskAffinity和singleTask启动模式配对使用的时候,他是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同名字的任务栈中。

当TaskAffinity和allowTaskReparenting结合的时候,这种情况比较复杂,会产生特殊效果。当一个应用A启动应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true的话,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。例如,现在有两个应用A和B,现在A启动了B的一个Activity C,然后按Home键返回到桌面,然后点击B的应用图标,这个时候并不是启动了B的主Activity,而是重新显示了已经被A启动的Activity C,或者说C从A的任务栈中转移到了B的任务栈中。可以这么理解,A启动了C,这个时候C只能运行中A的任务栈里面,但是C属于应用B,正常情况下,它的TaskAffinity值肯定不能和A相同,所以当B启动后,B会创建自己的任务栈,这个时候系统发现C原本想要的任务栈已经被创建了,所以就把C从A的任务栈转移到了B的任务栈里面。

你可能感兴趣的:(Android)