Activity的四种加载模式

配置Activity时可指定android:launchMode属性,该属性用来配置该Activity的加载模式

standard:标准模式,这是默认的加载模式

singleTop:Task栈顶单例模式

singleTask:Task内单例模式

singlestance:全局单例模式

为什么要为Activity指定加载模式?加载模式有什么用?

Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会创建一个Task,然后启动这个应用的入口Activity(即配置配置为MAIN和LAUNCHER的Activity)

Android的Task是比较麻烦的概念,因为android本身没有为task提供API,因此开发者无法访问Task,只能调用Activity的getTaskId()方法来获取她所在的task的ID,事实上,我们可以把Task理解为Activity栈,Task以栈的形式来管理Activity,先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶。

那么Activity的加载模式,就负责管理实例化,加载Activity的方式,并且可以控制Activity与Task之间的加载关系

1. standard 模式

每次通过这种模式启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前的Task栈中,这种模式不会启动新的Task,新的Activity将会被添加到原有的task中

2. singleTop 模式

这种加载模式与standard模式基本相同,但有一点,当将要启动的目标Activity已经位于Task栈顶,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例,如果目标Activity的实例没有位于Task栈顶,此时android系统会重新创建Activity实例,并且将它加载到Task栈顶

3. singleTask 模式

采用这种加载模式的Activity在同一Task内只有一个实例,当系统采用singleTask模式启动Activity时,可分为三种情况:

  • 如果启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶
  • 如果启动的目标Activity存在并且已经位于Task栈顶,此时和singleTop模式的行为一样
  • 如果启动的目标Activity存在但是没有位于Task栈顶,系统将会把位于Activity上面的所有的Activity移出Task栈,从而使得目标Activity转入栈顶

4. singleInstance 模式

在这种模式下,系统保证无论从哪一个Task中启动目标Activity,都只会创建一个目标Activity实例,并会使用全新的Task栈来加载该Activity实例,当系统采用singleInstance模式启动Activity,可分为两种情况:

  • 如果将要启动的目标Activity不存在,系统将会创建全新的Task,再创建一个目标Activity的实例,并将它加入到新的Task栈顶
  • 如果将要启动的目标Activity实例已经存在,无论它位于那个应用程序中,位于哪个Task中,系统都将会把该Activity所在的Task转到前台,从而使该Activity显示出来

需要注意的是:采用singleInstance 模式加载的Activity总是位于Task栈顶,且采用singleInstance模式加载的Activity所在的Task将只包含该Activity。

你可能感兴趣的:(Activity的四种加载模式)