官方解释
allowTaskReparenting 当下一次将启动 Activity 的任务转至前台时,Activity 是否能从该任务转移至与其有相似性的任务 —“true”表示可以转移,“false”表示仍须留在启动它的任务处。 如果未设置该属性,则对 Activity 应用由 元素的相应 allowTaskReparenting 属性所设置的值。默认值为“false”。 正常情况下,Activity 启动时会与启动它的任务关联,并在其整个生命周期中一直留在该任务处。当不再显示现有任务时,您可以使用该属性强制 Activity 将其父项更改为与其有相似性的任务。该属性通常用于将应用的 Activity 转移至与该应用关联的主任务。
例如,如果电子邮件消息包含网页链接,则点击该链接会调出可显示该网页的 Activity。该 Activity 由浏览器应用定义,但作为电子邮件任务的一部分启动。如果将该 Activity 的父项更改为浏览器任务,则它会在浏览器下一次转至前台时显示,在电子邮件任务再次转至前台时消失。
理解:每个Activty的启动,都会位于一个任务栈中。当将activity的allowTaskReparenting设置为true时,表示当这个Activity被其他应用程序启动后,位于其他应用程序的任务栈中时,启动该应用程序,会将该Activity从其他的任务栈移到本程序的任务栈。
测试: 编写两个应用程序,developArtLearn和taskReparentingTest,在developArtLearn中用隐式意图启动taskReparentingTest的Test这个Activity,该Activity的android:allowTaskReparenting属性设置为true。 taskReparentingTest的主Activity是MainActivity。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startActivity(new Intent("com.android.taskreparentingtest.Test"));
}
}
<activity android:name=".Test"
android:allowTaskReparenting="true">
<intent-filter>
<action android:name="com.android.taskreparentingtest.Test"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
启动developArtLearn后,用隐式意图启动taskReparentingTest的Test 在命令行中使用命令 adb shell dumpsys activity 显示模拟器的任务栈情况。 可以看到有两个Activity Test和MainActivity 他们都处于同一个任务栈中,com.android.developartlearn任务栈中。当前显示的是Test。
当从桌面点击图标,taskReparentingTest进入应用时,再使用命令adb shell dumpsys activity查看模拟器的任务栈情况。 可以看到,有两个Activity,他们分处两个不同的任务栈中。可以看到之前的Test(7a63ed9)被移到了新的任务栈com.android.taskreparentingtest任务栈中。
如果去除Test的android:allowTaskReparenting属性,由于android:allowTaskReparenting属性的默认值为false,所以它不会将Test从其他应用程序的任务栈中移到自己应用程序的任务栈中。
启动developArtLearn后,再使用隐式意图启动Test 可以看到有两个ActivityTest和MainActivity,他们都处于一个任务栈中com.android.developartlearn。
当从桌面点击图标,taskReparentingTest进入应用时,再使用命令adb shell dumpsys activity查看模拟器的任务栈情况。 可以看到有三个Activity它们分别处于两个任务栈中,taskReparentingTest的MainActivity,当前正在显示,我们点击应用图标进入该应用的主Activity。它处于com.android.taskreparentingtest任务栈中。 developArtLearn的MainActivity和taskReparentingTest的Test都处于com.android.developartlearn任务栈中。
当将android:allowTaskReparenting置为false时,由developArtLearn用隐式意图启动taskReparentingTest的Test后,再从桌面点击图标进入taskReparentingTest后,它没有将在com.android.developartlearn的Test移到自己的任务栈中,任然位于之前的任务栈中。而是启动了该应用的主Activity。可以看到它的任务栈com.android.taskreparentingtest中只有MainActivity。
|