Android TaskAffinity和allowTaskReparenting

本文详细介绍了Android中TaskAffinity和allowTaskReparenting属性,解释了它们如何影响Activity的归属和任务迁移。TaskAffinity决定了Activity所属的任务,而allowTaskReparenting允许Activity在符合条件时改变其所属任务。通过示例展示了这两个属性在不同场景下的行为,包括Activity在不同应用间迁移的情况。同时,还讨论了其他与Task管理相关的manifest配置选项,如alwaysRetainTaskState、clearTaskOnLaunch、finishOnTaskLaunch和launchMode等。

1.TaskAffinity
affinity是指Activity的归属,Activity与Task的吸附关系,也就是该Activity属于哪个Task。一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Task中度过自己的生命。每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于应用的包名。而Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值。
我们可以通过在元素中增加taskAffinity属性来为某一个Activity指定单独的affinity。这个属性的值是一个字符串,可以指定为任意字符串,但是必须至少包含一个”.”,否则会报错。

2.allowTaskReparenting
翻译过来的意思是允许重新找父母(允许迁移任务栈),该属性用于配置是否允许该activity更换从属的task。
如果一个Activity设置了这个属性,其他应用启动这个activity的时候分两种情况处理:
①这个activity对应的进程已经启动了:则这个activity直接附属到自己所对应的进程的应用栈上
②这个activity对应的进程没有启动:则这个activity先直接附属到启动它的应用的应用栈上,当activity对应的进程启动后,则会主动迁移到activity对应的进程。

也就是说,当下一次将启动 Activity 的任务转至前台时,Activity 是否能从该任务转移至与其有相似性的任务 ,“true”表示可以转移,“false”表示仍须留在启动它的任务处。如果未设置该属性,则对 Activity 应用由 元素的相应 allowTaskReparenting 属性所设置的值。默认值为“false”。
例如,如果电子邮件消息包含网页链接,则点击该链接会调出可显示该网页的 Activity。该 Activity 由浏览器应用定义,但作为电子邮件任务的一部分启动。如果将该 Activity 的父项更改为浏览器任务,则它会在浏览器下一次转至前台时显示,在电子邮件任务再次转至前台时消失。

理解:每个Activty的启动,都会位于一个任务栈中。当将activity的allowTaskReparenting设置为true时,表示当这个Activity被其他应用程序启动后,位于其他应用程序的任务栈中时,启动该应用程序,会将该Activity从其他的任务栈移到本程序的任务栈。

有一个比喻非常之形象:
你捡到一条狗,在家里喂养几天觉得不错,当自己家的了;但是突然有一天他的主人找上门来了,小狗还是乖乖和主人走了。。。
这条狗就是带有allowTaskReparenting属性的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.taskr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值