我们都知道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情况
<activity
android:name=".view.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".view.ThirdActivity"
android:taskAffinity=".ThirdActivity">
</activity>
然后在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);
或者
<activity
android:name=".view.ThirdActivity"
android:taskAffinity=".ThirdActivity"
android:launchMode="singleTask">
</activity>
image.png
可以看到ThirdActivity在.ThirdActivity任务栈中,MainActivity在com.example.ziv.myapplication任务栈中。
- 2.Activity 设置
allowTaskReparenting = "true"
在这种情况下,Activity 可以从其启动的任务移动到与其具有关联的任务(如果该任务出现在前台)。
例如,假设将报告所选城市天气状况的 Activity 定义为旅行应用的一部分。 它与同一应用中的其他 Activity 具有相同的关联(默认应用关联),并允许利用此属性重定父级。当您的一个 Activity 启动天气预报 Activity 时,它最初所属的任务与您的 Activity 相同。 但是,当旅行应用的任务出现在前台时,系统会将天气预报 Activity 重新分配给该任务并显示在其中。
网友评论