这篇文章主要介绍的是Android-Activity的四大启动模式:
standard、singleTop、singleTask、singleInstance
先来看看这四种模式的思维导图:
下文以模拟场景:在MainActivity中启动SecondActivity作讲解。
1.Standard(默认模式)
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准备新的任务栈,并不会让它们共处一个任务栈。
后面会持续的添加相关代码上来。
如有错误,欢迎能够指出,十分感谢!