美文网首页
《BYM》常见App中TaskAffinity的使用小记

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

作者: markfrain | 来源:发表于2021-04-10 17:16 被阅读0次

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的使用小记

    blow your mind bym系列意在除开技术分享,还分享下思路,不止是做一个代码的搬运工。 背景介绍 最近...

  • taskAffinity的使用

    taskAffinity 是 Application 和 Activity 的属性。 Activity 的...

  • Activity的Launch Mode

    SingleTask: 全局唯一性,只会在task为自己的taskAffinity的栈中启动。a.在自己的APP中...

  • 关于SwipeRefreshLayout的刷新事件

    --关于SwipeRefreshLayout使用的小记录我们常见的SwipeRefreshLayout包裹Recy...

  • launchmode与TaskAffinity

    一、TaskAffinity 任务亲和性 taskAffinity 任务栈亲和性 taskAffinity相同的a...

  • Android Activity 任务和返回栈

    Activity中的属性 taskAffinity launchMode allowTaskReparenting...

  • activity启动

    TaskAffinity属性,一般和singleTask模式或allowTaskReparenting属性配合使用...

  • 图片轮播

    图片轮播 图片轮播在APP中的使用常见度就不用多说。此demon主要使用到UIScrollView,NSTimer...

  • 登录页面

    登录 在APP中如果要建立自己的用户体系,就需要建立用户的唯一标识。在常见的APP中,通常使用登录(包含快捷登录)...

  • ViewPager+Timer实现图片轮播

    前言 图片轮播在各类手机App中都很常见,尤其是新闻类App(知乎日报)。在 Android 中,使用 ViewP...

网友评论

      本文标题:《BYM》常见App中TaskAffinity的使用小记

      本文链接:https://www.haomeiwen.com/subject/vvynkltx.html