activity标签中task的相关属性(接上篇Activity启动模式)

昨天更新了Activity的启动模式,不知道大家是不是看的头皮发麻-。+。。。昨天说到还有一点点东西,今天给大家补上一点,篇幅不会很多。

今天这篇主要是针对AndroidManifest中,Activity标签下的一些关于Task属性,至于Task是什么就不多说了,在上一篇中比较详细的讲过,如果没看过的朋友可以关注一下笔者上一篇的文章:细谈Activity四种启动模式不多扯皮了,直接进入正题:

我们在上节课中讲解Activity的启动模式,其实现在回想一下,主要Task栈内的元素改变。所以归根到底,还是围绕着Task栈。

那其实除了给Activity设置启动模式之外,Activity还有一些相关的属性,也是关于Task的。

allowTaskReparenting

标记此属性的Activity实例所在的当前应用  在退居后台后,决定是否将标记的Activity从启动的Task移动到相同affinity的Task(需要和taskaffinity属性配合使用):

  • true:可以移动。
  • false(默认):不能移动。

这个话笔者已经尽量的精简的来说了-。+,再简单解释下就是:我们给一个Activity实例标记了此属性并设置为true。当他所在的Application退到后台之后,就会将Activity实例移动到具有相同的affinity。

由此我们也能知道,对于此种情况,我们不能默认Activity的affinity,必须手动设置(taskAffinity)。

还不清楚的话,还是上一张图吧:


这张图可以说良心之作了,相信大家看的也比较明白吧:

首先我们给TwoApp的TwoActivity设置了allowTaskReparenting属性。

在OneApp中的MainActivity点开了TwoApp的TwoActivity,在默认情况下它还是在OneApp显示的,然后我们点击Home键,TwoApp的TwoActivity就会移动到TwoApp的Task(因为TwoActivity默认的affinity就是TwoApp的包名。。。)

好了,现在我们用代码来实现一下看一下效果:

为了让大家看的明确,我还是老规矩,把所有任务全都清空

然后我们点开OneApp:

接着启动TwoApp的TwoActivity:

我们发现现在还是一个任务。

现在我们点击Home键,再点开OneApp:

我们发现再次点开之后,TwoApp的TwoActivity消失了。

那我们点开TwoApp看一下:

我们看到刚刚创建的TwoActivity现在在TwoApp中(因为我们刚刚创建TwoApp并没有启动TwoActivity)。

所以关于这个属性,我想我们可以过了。

alwaysRestainTaskState

首先这个属性,只针对根Activity起作用。

标记应用的Task师傅保持原来的状态:

  • true:总保持
  • false(默认):不保证维持原来状态

这个我们这么解释:我们的App如果长期在后台带着不使用,我们的系统会对应用的Task进行清理,而清理过程中,如果我们对根Activity标记了这个属性,那么他会保留我们根Activity的状态。

这个没把饭举例子,相信大家是可以理解的。

clearTaskOnLaunch

这个属性也只是针对根Activity起作用的。

每次唤醒应用是,是否清楚除跟Activity的所有Activity:

  • true:清楚
  • false(默认):不清除

这个我们很简单,我们聚一下例子就好。

我们的OneApp进行1->2,2->3,然后点Home键,然后在重新唤醒应用到前台来,我们就知道了。

这个比较简单,一步带过了:

根据日志我们也看出来,2和3确实是被销毁了:

这个属性过。

finishOnTaskLaunch

这个属性跟clearTaskLaunch很像,只不过他只是销毁标记的Activity,而clearTaskOnLaunch是除了根Activity全部销毁。

noHistory

标记的Activity(包括根Activity)跳转到其他Activity时,Task不将其压入栈。

这个我来解释一下,比如说我们从MainActivity跳转到TwoActivity,那么Task应该讲MainActivity压入栈,但是如果给MainActivity标记了noHistory属性,那么他就不会被压入栈。

代码实例:我们给MainActivity标记为onHistory,然后让其从1->2,点击back,看看发生了什么:


点击back后并没有退回到MainActivity,而是直接回到了Home界面,这说明此时Task已经被销毁。


根据以上日志我们也可以看出来,并没有调用MainActivity的onDestroy相关方法,可见他根本就没有入Task栈。


好了,以上便是我们今天补充的所有内容,喜欢的朋友希望点赞关注一波,有不同意见的可以在下方留言。

猜你喜欢

转载自blog.csdn.net/zy_jibai/article/details/80605958