allowTaskReparenting学习

官方解释

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。

//taskReparentingTest中用隐式意图启动taskReparentingTest的Test
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"));
    }
}
	<!--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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值