一、四种启动模式

Activity的启动模式有4种,分别为standard、singleTop、singleTask、singleIntance。4种启动模式的区别主要与Activity的任务栈管理有关,栈是一种后进先出的集合。

二、Activity启动模式的设置

在AndroidManifest.xml中 ,注册Activity时可以设置Activity启动模式, android:launchMode=”” ,这个属性用于配置Activity的启动模式,属性缺省启动模式为standard。

示例

<activity android:name=".MainActivity" android:launchMode="standard" />

三、各个启动模式的区别

standard

这是Activity的标准启动模式,也是Activity的默认启动模式。在这种启动模式下的Activity可以被多次实例化,即在同一个任务栈中可以存在多个该Activity的实例。如果ActivityA的启动模式为standard,且已经有一个ActivityA实例被启动,在ActivityA中调用startActivity时会启动一个新的Activity实例,对系统性能的消耗过大。

singleTop

如果在任务栈的栈顶正好存在该Activity的实例, 就会重用位于栈顶的该实例,不会创建新的Activity对象,并且不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用该实例的onNewIntent()函数将Intent对象传递到这个实例中,否则就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

singleTask

在同一个Task内只能有一个Activity实例:

  1. 如果启动的目标Activity不存在Task任务栈中,系统将会创建一个目标Activity实例,并将它加入到Task栈顶
  2. 如果启动的目标Activity已存在Task任务栈的栈顶,就会重用位于栈顶的该实例,并且不会再调用通常情况下我们处理请求数据的onCreate方法,而会调用该实例的onNewIntent()函数将Intent对象传递到这个实例中。(同singleTop)
  3. 若果启动的目标Activity已存在但没有位于Task任务栈的栈顶,系统将会把任务栈中该目标Activity上面的所有Activity移除Task栈,使该Activity置于Task栈顶。

singleInstance

设置了singleInstance模式的Activity会在一个独立的任务中开启,并且在这个任务中有且只有这一个实例。当再次启动该Activity实例时,会重用已存在的任务和实例,并且会调用该实例的onNewIntent()函数来接收Intent。类似浏览器工作原理,不管多少应用要启动该Activity,这个Activity有且只有一个。

总结:

standard:标准模式,系统的默认模式

singleTop:栈顶复用模式,Activity如果在栈顶就不会被重新创建

singleTask:栈内复用模式,Activity如果在某个栈中存在就不会被重新创建

singleInstance:单实例模式,是加强版的singleTask,当实例创建后,系统会建一个新的任务栈(独立存在)