美文网首页
Activity的启动模式

Activity的启动模式

作者: 耿之伟 | 来源:发表于2021-02-06 15:17 被阅读0次

    activity有四种静态启动模式,分别是:默认启动模式standard;栈顶复用模式singleTop;栈内复用模式singleTask;全局唯一模式singleInstance;

    默认启动模式standard

    顾名思义这个模式就是默认的启动模式,也是最容易理解的启动模式。


    standard.png

    从这张图可以很清晰的看出standard模式就是简单的栈的进栈和出栈,先进后出。

    栈顶复用模式singleTop

    singleTop,栈顶复用模式意思就是说如果这个activity是在栈顶,再次启动这个activity就直接复用,不创建新的activity。


    singleTop.png

    图中activity2是singleTop模式,可以看出当activity2在栈顶部的时候,再次启动activity2,没有创建新的activity,而是直接复用了当前的activity2.

    栈内复用模式singleTask

    与singleTop类似,只不过singleTop只是复用栈顶的元素,而singleTask可以复用栈内的所有元素,当启动的activity在栈内已经存在时,singleTask模式直接弹出目标activity之上的所有元素,讲目标元素置于栈顶。

    singleTask.png
    activity1是singleTask模式,当再次启动activity1的时候,栈内已经存在目标activity(activity1),则弹出activity1之上的所有activity,讲目标置于栈顶。
    应用场景
    程序主界面,我们肯定不希望主界面被多创建,而且在主界面退出的时候退出整个App是最好的设想。
    耗费系统资源的Activity:对于那些及其耗费系统资源的Activity,我们可以考虑将其设为singleTask模式,减少资源耗费(在创建阶段耗费资源的情况,个人理解-。+)

    全局唯一模式singleInstance

    这是我们最后的一种启动模式,也是我们最恶心的一种模式:在该模式下,我们会为目创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)。
    为了方便理解,也为了与standard模式融会贯通,我在下图中activity1和activity2使用的是standard模式,而activity3使用的是singleInstance模式


    singleInstance.png

    动态设置启动模式

    在上述所有情况,都是我们在Manifest中设置的(通过launchMode属性设置),这个被称为静态设置(我们写程序写多了会发现有静态就有动态,而且静态多数在xml设置,动态在java代码设置),接下来我们来看一下如何动态的设置Activity启动方式。
    注):如果同时有动态和静态设置,那么动态的优先级更高。

    intent.setFlags(、、、、、);
    

    动态设置启动模式就是利用Intent启动activity的时候,设置flag。

    常见的几种flag

    Intent.FLAG_ACTIVITY_NEW_TASK

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

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

    但是此情况和singleInstance有不同,有两点注意的地方:
    1. 新的Task没有说只能存放一个目标Activity。只是说决定是否新建一个Task。而singleInstance模式下新的Task只能放置一个目标Activity。
    2. 在同一应用下,如果Activity都是默认的affinity,那么此Flag无效。而singleInstance默认情况也会创建新的Task。

    Intent.FLAG_ACTIVITY_SINGLE_TOP

    和静态中的singleTop效果相同

    Intent.FLAG_ACTIVITY_CLEAR_TOP

    和静态中国呢的singleTask类似
    当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,

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

    • 如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
    • 没有设置。。。。。。。,则将栈内的对应Activity销毁重新创建。

    _CLEAR_TOP和_SINGLE_TOP同时设置的情况下,就是singleTask模式。
    而唯一不同的一点就在于:他会销毁已存在的目标实例,再重新创建。

    相关文章

      网友评论

          本文标题:Activity的启动模式

          本文链接:https://www.haomeiwen.com/subject/ogfotltx.html