《BYM》常见App中TaskAffinity的使用小记

blow your mind

bym系列意在除开技术分享,还分享下思路,不止是做一个代码的搬运工。

背景介绍

最近在阅读《Android开发艺术探索》,书是2015年出的,但是内容却对我来说是新的。在1.2 Activity的启动模式一章中有这么一段话。

TaskAffinity,可以翻译为任务相关性。这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。当然,我们可以为每个Activity都单独指定TaskAffinity属性,这个属性值必须不能和包名相同,否则就相当于没有指定。TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下没有意义。另外,任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。

前台任务栈和后台任务栈

首先官方并没有定义这两个概念,笔者应该是方便理解自行定义的。我们可以做如下理解

  • 前台任务栈:当前处于前台并运行、可见并能和用户交互的APP应用所在的栈。
  • 后台任务栈:当前处于后台、不可见也不能和用户交互的APP应用所在的栈。

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

TaskAffinity+singleTask

创建一个默认启动模式的KtActivity和一个SingleTask加上android:taskAffinity="com.markfrain.singleTask"的SingleTaskActivity。
接口我们先启动KtActivity,从KtActivity中启动single

Running activities (most recent first):
      TaskRecord{b85f8b6 #2082 A=com.bimfoo.tools.demo U=0 StackId=1981 sz=1}
        Run #0: ActivityRecord{fcca610 u0 com.bimfoo.tools.demo/.ui.KtActivity t2082}

    mResumedActivity: ActivityRecord{fcca610 u0 com.bimfoo.tools.demo/.ui.KtActivity t2082}
Running activities (most recent first):
      TaskRecord{c9689b7 #2081 A=com.markfrain.singleTask U=0 StackId=1980 sz=1}
        Run #0: ActivityRecord{a3a31cb u0 com.bimfoo.tools.demo/.ui.SingleTaskActivity t2081}

问题出现了,并没有像文字描述那样KtActivity在与SingleTaskActivity在一个任务栈中。
或许文字的意思只是单指SingleTaskActivity会在taskAffinity字段指定的任务栈中?如果是这样那就没错了。

好的接下来看第二段

当TaskAffinity和allowTaskReparenting结合的时候,这种情况比较复杂,会产生特殊的效果。当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true的话,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。这还是很抽象,再具体点,比如现在有2个应用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的任务栈中转移过来了。

TaskAffinity和allowTaskReparenting

根据上面的文字描述, 让我想起了最近玩的淘宝的芭芭农场,哈哈,我画个图来演示下上述过程吧。读者看到也可以玩玩芭芭农场就能明白allowTaskReparenting这个属性了。如下图

应用A启动应用B的某个Activity淘宝芭芭农场启动支付宝芭芭农场

第一步

home键后,点击应用B的图标home键后,点击支付宝图标

第二步

allowTaskReparenting如果设置为flase就是不允许将Activity移入其他的任务栈。

参考资料 《Android开发艺术探索》

你可能感兴趣的:(《BYM》常见App中TaskAffinity的使用小记)