Android Activity的launchMode四种启动模式备忘
Android的Activity的启动模式有四种,在AndroidManifest.xml通过配置Activity的android: launchMode可以设置。分别是:standard(标准模式), singleTop(单顶模式), singleTask(单任务模式),singleInstance(单例模式)。
了解Android的Activity启动模式,首先要了解Activity的“回退栈(BackStack)”概念。Android启动Activity后,会建立一个栈数据结构存放当前App拉起来的Activity,在栈中自底往上存放启动的Activity。当在AndroidManifest.xml配置launchMode后,将会决定Activity启动的行为模式。以下是Activity四种启动模式:
(一)standard标准模式
standard标准启动模式是Android Activity默认的启动模式,如果没有在AndroidManifest.xml配置Activity的launchMode,那么standard就是该Activity的启动模式。
假设当前回退栈存自底往上存在A-B-C。假设C配置了启动模式为标准模式standard。此时C又startActivity(C),那么此时将会再次重新创建一个实例C压入回退栈,栈结构变化为A-B-C-C。可以简单认为standard标准模式是简单、无脑的创建Activity实例,创建完直接压入回退栈。
(二)singleTop单顶模式
singleTop单顶启动模式,顾名思义,保持唯一一个Activity处于顶部。singleTop单顶启动模式会回调onNewIntent函数。singleTop单顶模式细分情景有些复杂。假设C配置启动模式为singleTop:
(a)假设当前回退栈A-B-C。此时C又startActivity(C),那么此时不会像standard标准启动模式下无脑新起一个实例C压入栈顶,而是直接复用实例C,最后栈的结构变为:A-B-C。此处的C不会进入onCreate和onStart等生命周期,但会回调onNewIntent。
(b)假设当前回退栈栈顶没有C,那么此时和standard标准启动模式一样,创建一个新的Activity实例压入栈。
(c)假设当前回退栈是A-B-C-D。此时D又startActivity(C),那么此时的栈结构变为A-B-C-D-C。
(三)singleTask单任务模式
singleTask单任务启动模式,保持当前回退栈处于栈顶且唯一,同时回调onNewIntent。比如当前栈A-B-C-D。假设B配置了启动模式为singleTask单任务模式。D又startActivity(B),此时Android系统发现栈中已存在B,那么Android的处理方式就是把B之上的全部Activity实例弹出栈,此时栈结构变为A-B。同时回调onNewIntent。
如果此时栈中没有B,那么就创建一个实例B压入栈。
singleTask单任务启动模式,通常的开发场景,比如,一个App存在很多个页面,当用户使用一段时间后,进入的Activity层级很深后,想一键回到主页(Home Page),那么这么singleTask单任务启动模式配置后的主页Activity就可以实现这个目的。
(四)singleInstance单例模式
singleInstance单例启动模式,该启动模式下的Activity单独占有一个回退栈,并且该栈是Android系统全局唯一的,真正的单例模式。通常的开发场景中比如web浏览器,就是这种启动模式,全Android系统唯一一个单例,不管是哪个Activity调用和start。
备注:Android的Activity四种启动模式其实本身没什么特别需要研究的,但是时间久后容易混淆淡忘分不清楚不同启动模式的细微差别,此处简单记下留作备忘查阅。