文章目录
  • 0. Task
  • 1. standard
  • 2. singleTop
  • 3. singleTask
  • 4. singleInstance
  • Task

    Activity是Android应用程序的基础组件之一,在应用程序运行时,每一个Activity代表一个用户操作。用户为了完成某个功能而执行的一系列操作就形成了一个Activity序列, 这个序列在Android应用程序中就称之为任务(Task),它是从用户体验的角度出发,把一组相关的Activity组织在一起而抽象出来的概念。

    standard

    默认启动模式,可创建多个实例,也允许多个Activity相互叠加。

    singleTop

    可以有多个实例,但是不允许多个相同Activity叠加。若不在栈顶,则新建实例;若实例在栈顶,则重用该实例。

    singleTask

    只能存在一个实例。相当于Task内单例模式。若不存在则创建实例;若栈中已存在该实例,则重用该实例。重用时,该实例会回到栈顶,并将它上面的其他实例移除栈,并进入onNewIntent方法中。 比如1和3启动模式是standard,2是启动模式是singleTask,启动顺序是133111211333213312,返回是133111,只保留了最开头几个栈。2之间的栈都被移除了。

    singleInstance


    只存在一个实例,独立运行于一个task中。相当于全局单例模式。

    比如1,3,4的启动模式是standard,2启动模式为singleInstance,启动顺序是4312434324,退出顺序为434342。

    而且,我发现一个很有意思的事。如果如果按照43124的启动顺序,在启动第二个4时,实际启动的activity却是1,也就是2之前的那个。我猜想,可能跟task最开始的默认的启动类有关。 一旦在2之后启动最开始的默认启动类(也就是这里的4),结果并不是创建一个新的4,而是重用了在2之前的那个类。

    明明4是standard,仅仅因为是默认的启动类,竟然被重用了。这实在太不合理了!!!到底是为什么??? 经过一番思索,我想,或许,是因为我忘记考虑了一个问题:134都在同一个task中,而2在另一个task中。

    这说明,不同task之间的启动顺序,可能并不像想象的那样。

    然而智商有限,使得这个问题蒙上了一层神秘的面纱,sorry。

    欢迎有想法的童鞋指教。

    Fork me on GitHub