Android taskAffinity和allowTaskReparenting属性详解

Android taskAffinity和allowTaskReparenting属性详解_第1张图片
image.png

我们都知道Activity中有任务栈的概念,那什么是Activity所需的任务栈呢,这就要从一个参数说起了,TaskAffinity,可以翻译为任务的相关性,这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity的所需的任务栈名字都为应用的包名。当然,我们可以单独的给每一个Activity指定单独的任务栈,这就需要通过taskAffinity来指定了,当然不能与应用包名相同( 不然指定跟没指定效果是一样的)。

  • 1.默认情况下,Activity的任务栈与启动它的Activity的任务栈是一样的,如果想要单独的给某个Activity指定单独的任务栈,这就需要设置TaskAffinity属性以及设置启动模式为singleTask,或者在代码中设置为FLAG_ACTIVITY_NEW_TASK
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

这样才能单独的给Activity指定任务栈。
下面可以通过一个例子来看看:

1.只设置taskAffinity情况

       
           
           
       



然后在MainActivity中启动ThirdActivity

Intent intent = new Intent(MainActivity.this,ThirdActivity.class);
startActivity(intent);

然后在来看看任务栈的情况


image.png

可以知道,ThirdActivity是在MainActivity所在的任务栈中,所以说,单独设置android:taskAffinity不会产生任何作用。

2.设置Activity启动模式为singleTask或者设置FLAG_ACTIVITY_NEW_TASK,再来看看任务栈的情况,代码就不贴出来了,
Intent intent = new Intent(MainActivity.this,ThirdActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

或者

   
    

Android taskAffinity和allowTaskReparenting属性详解_第2张图片
image.png

可以看到ThirdActivity在.ThirdActivity任务栈中,MainActivity在com.example.ziv.myapplication任务栈中。

  • 2.Activity 设置
allowTaskReparenting = "true"

在这种情况下,Activity 可以从其启动的任务移动到与其具有关联的任务(如果该任务出现在前台)。
例如,假设将报告所选城市天气状况的 Activity 定义为旅行应用的一部分。 它与同一应用中的其他 Activity 具有相同的关联(默认应用关联),并允许利用此属性重定父级。当您的一个 Activity 启动天气预报 Activity 时,它最初所属的任务与您的 Activity 相同。 但是,当旅行应用的任务出现在前台时,系统会将天气预报 Activity 重新分配给该任务并显示在其中。

你可能感兴趣的:(Android taskAffinity和allowTaskReparenting属性详解)