Android必读之TaskAffinity

Task

了解TaskAffinity之前我们先简单了解一下什么是Task:
简单来说Task是在程序运行时只针对activity的概念。说白了,task是一组相互关联的activity的后进先出的栈结构。这个栈的基本行为是,当用户在多个activity之间跳转时,执行压栈操作,当用户按返回键时,执行出栈操作。举例来说,如果应用程序中存在A,B,C三个activity,当用户在Launcher或Home Screen点击应用程序图标时,启动主Activity A,接着A开启B,B开启C,这时栈中有三个Activity,并且这三个Activity默认在同一个任务(task)中,当用户按返回时,弹出C,栈中只剩A和B,再按返回键,弹出B,栈中只剩A,再继续按返回键,弹出A,任务被移除。如下图所示
《Android必读之TaskAffinity》
task是可以跨应用的,这正是task存在的一个重要原因。有的Activity,虽然不在同一个app中,但为了保持用户操作的连贯性,把他们放在同一个任务中。例如,在我们的应用中的一个Activity A中点击发送邮件,会启动邮件程序的一个Activity B来发送邮件,这两个activity是存在于不同app中的,但是被系统放在一个任务中,这样当发送完邮件后,用户按back键返回,可以返回到原来的Activity A中,这样就确保了用户体验。

TaskAffinity

那么什么是TaskAffinity属性呢,可以简单的理解为任务相关性。

  1. 这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名
  2. 我们可以单独指定每一个Activity的taskAffinity属性覆盖默认值
  3. 一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity
    在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务
  4. 为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task

很重要的一点taskAffinity属性不对standard和singleTop模式有任何影响,即时你指定了该属性为其他不同的值,这两种启动模式下不会创建新的task(如果不指定即默认值,即包名)
指定方式如下:

<activity android:name=".ActivitySingleTop"
          android:launchMode="singleTop"
          android:taskAffinity="com.xxxsingletop"/>
<activity android:name=".ActivityStandard"
               android:launchMode="standard"
               android:taskAffinity="com.xxx.standard"/>

了解更多Android启动模式:

Android必读之SingleTop、SingleTask等Activity启动方式的区别

点赞

发表评论