这篇文章主要介绍的是Android-Activity的四大启动模式:

 standard、singleTop、singleTask、singleInstance 

先来看看这四种模式的思维导图:

Activity四大启动模式


下文以模拟场景:在MainActivity中启动SecondActivity作讲解。

1.Standard(默认模式)

这个模式是系统的默认模式,也称为标准模式,如果没有指定的启动模式,那么都会使用这个标准模式。这个模式的特点是:在当前的Activity(MainActivity)中启动第二个Activity(SecondActivity),SecondActivity会归属到MainActivity的任务栈中(无论你是否指定了TaskAffinity,且无论该任务栈是否已存在SecondActivity实例,系统都会创建新的Activity实例。

2.SingleTop (栈顶复用模式)

首先需要明白的是:该启动模式仍然不会启动新的任务栈,无论你是否指定了TaskAffinity属性。

明白了这一点,接着请往下看

这个模式主要有三种情况:

若该任务栈中不存在SecondActivity实例,那么会创建新的SecondActivity实例。

若该任务栈中存在SecondActivity实例,但不位于栈顶,则会创建新的SecondActivity实例。

若该任务栈中存在SecondActivity实例,且位于栈顶,则会复用该实例。

3.SingleTask (栈内复用模式)

这种启动模式能够指定创建SecondActivity的任务栈,即利用TaskAffinity属性指定任务栈(任务栈不存在时,创建新的任务栈),若不指定,则默认为MainActivity的任务栈。

接下来,会判断任务栈中是否已存在SecondActivity实例:

若不存在,则创建新的SecondActivity实例。

若已存在,则会使该SecondActivity实例以上的其他Activity统统出栈,来让自身实例位于栈顶,并复用该实例。


4.SingleInstance(全局唯一模式)

这种启动模式也称全局单例模式,顾名思义,及整个系统中仅存在该Activity的一个实例。

在启动SecondActivity时,

若系统中没有存在SecondActivity实例,则创建一个SecondActivity实例并独占一个任务栈,后续再启动该Activity时,都会复用这个全局唯一实例,除非该任务栈被销毁。

若启动时,发现系统已存在一个SecondActivity时,都会复用这个全局唯一实例


这里做过一个小测试:即将MainActivity和SecondActivity都指定同一个任务栈,在OnCreate()方法中打印它们的TaskId,

发现系统会自动的为SecondActivity准备新的任务栈,并不会让它们共处一个任务栈。


后面会持续的添加相关代码上来。


如有错误,欢迎能够指出,十分感谢!





相关文章: