Activity启动模式

2019-08-16  本文已影响0人  7i昂

静态设置

启动模式的类别:

standard:

标准模式,也是默认模式。每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已经存在。

singleTop:

栈顶复用模式,如果要启动的Activity处于栈的顶部,那么此时系统不会创建新的实例,而是直接打开此页面,同时它的onNewIntent()方法会被执行,可以通过Intent进行传值,而且它的onCreate(),onStart()方法不会被调用,因为它并没有发生任何变化。

singleTask:

栈内复用模式,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。

singleInstance:

单实例模式,该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

动态设置

Intent.FLAG_ACTIVITY_NEW_TASK

这个Flag跟我们的singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配:如果已经存在与其affinity相同的task,则将目标Activity压入此Task。 反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。

其实简单来说,就是先看看需不需要创建一个新的Task,根据就是有没有相同的affinity。然后把Activity放进去。

但是此情况和singleInstance有不同,有两点注意的地方:

新的Task没有说只能存放一个目标Activity。只是说决定是否新建一个Task。而singleInstance模式下新的Task只能放置一个目标Activity。
在同一应用下,如果Activity都是默认的affinity,那么此Flag无效。而singleInstance默认情况也会创建新的Task。

Intent.FLAG_ACTIVITY_SINGLE_TOP

该模式比较简单,对应Flag如下:

Intent.FLAG_ACTIVITY_SINGLE_TOP
次Flag与静态设置中的singleTop效果相同,所以请见二、2.

Intent.FLAG_ACTIVITY_CLEAR_TOP

这个模式对应的Flag如下:

Intent.FLAG_ACTIVITY_CLEAR_TOP
当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,

如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:

如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
没有设置。。。。。。。,则将栈内的对应Activity销毁重新创建。
关于这个Flag,我们发现他和singleTask很像,准确的说,是在_CLEAR_TOP和_SINGLE_TOP同时设置的情况下,就是singleTask模式。

而唯一不同的一点就在于:他会销毁已存在的目标实例,再重新创建。这个我们通过打印一下生命周期就好。

上一篇 下一篇

猜你喜欢

热点阅读