为什么要有加载模式?加载模式有什么用?
这可能需要介绍下Android对Activity的管理:Android采用Task来管理多个Activity,当我们启动一个应用时,Android会创建一个Task,然后启动入口Activity(既指定<intent-filter>为MAIN和LAUNCHER)的Activity。
这边Task可以理解为Activity栈,先启动的Activity放在栈底,后启动的Activity放在栈顶。
Activity的加载模式就是为了负责管理实例化和加载Activity的方式,而且可以控制Activity与Task之间的关系。
因此总结一下就是:加载模式是管理和加载Activity的方式。
Activity配置时可以指定android:launchMode 该属性是用于配置该Activity的加载模式。可以支持4个属性:
standard: 标准模式,默认的加载模式。
在启动一个以standard为launchMode的Activity时,android总是会创建一个新的Activity实例,将其放到Task栈中,这种模式不会创建新的Task,新的Activity将被添加到原有的Task中。这种是最常见的使用方式。singleTop: Task顶单例模式。
这种模式基本与standard相似。只是当目标Activity已经创建并位于Task栈顶时,系统不会再创建目标Activity,而是直接复用栈顶实例。保证栈顶只会有一个目标实例singleTask: Task内单例模式。
采用这种加载模式的Activity在同一个Task中只有一个实例,可以分为3中情况
a. 目标Activity不存在,系统创建目标Activity,并位于栈顶。
b. 如果目标Activity已经存在且位于栈顶,则其行为与singleTop模式行为相同
C. 如果目标Activity已经存在,但没有位于栈顶,系统将会把位于该Activity上面的Activity移出Task,使目标Activity转入栈顶singleInstance: 全局单例模式。
无论从那个Task中启动目标Activity时,只会创建一个目标Activity,且会使用一个全新的Task栈来装载该Avtivity。这里可以分2中启动情况:
a. 目标Activity不存在,系统会为其创建一个新的Task栈,并创建目标Activity。
b. 目标Activity已经存在,无论它位于那个应用程序或Task中,系统会把该Activity所在的Task转到前台显示。