Activity启动模式

Activity四种启动模式分析:

1. standard

这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。

2. singleTop

栈顶复用模式。
singleTop模式分3种情况

  1. 当当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法。
  2. 当当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例
  3. 当当前栈中不存在该Activity的实例时,其行为同standard启动模式。

standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task(任务栈),即使你指定了taskAffinity属性

taskAffinity:

  • 这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。
  • 我们可以单独指定每一个Activity的taskAffinity属性覆盖默认值
  • 一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity。
  • 在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务。
  • 为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task。

如:

Activity启动模式_第1张图片

3. singleTask

taskAffinity主要配合SingleTask启动模式使用的:

singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈

【如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去】
【如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例】
【如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法】
【如果不存在该实例,则新建Activity,并入栈】

此外,两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。

4. singleInstance

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

SingleInstance模式启动的Activity在系统中具有全局唯一性。

参考:Android Activity启动模式的功能验证

你可能感兴趣的:(android)