Activity的启动模式分为四种。(standard、singleTop、singleInstance、singTask);
任务栈
将启动模式之前,先介绍一下任务栈(Activity返回栈),既然是栈,那肯定遵循后进先出。它是用来存放Activity的,当我们点击桌面图标的时候,如果之前没有启动,对于andorid系统来说,会新开一个任务栈,并把我们的MainActivity压入栈中。这个时候一般就是我们看到的APP首页了,
一 standard(默认启动模式)
每次启动Activity都会在Activity栈顶上新建一个实例。
eg:如上图,C启动ABC任意一个时,都会在C上面创建出一个新的Activity实例。
生命周期:onCreate、onStart、onResume都会被调用。
二 singleTop(栈顶复用)
当意图启动一个Activity时,会先判断要启动的Activity是否在栈顶,如果在,则不会创建新的实例。否则,创建新的实例。
eg:如上图,如果在C中启动C,则不会创建新的实例,如果在C中启动AB,都会在C上面重新上传一个新的实例
生命周期:若情况一中栈顶的Activity被直接复用时,它的onCreate、onStart不会被系统调用,由于它并没有发生改变。可是一个新的方法 onNewIntent会被回调(Activity被正常创建时不会回调此方法)。
三 singleTask (栈内唯一)
当意图启动一个Activity时,会先判断要启动的Activity是否在栈中,如果在,咋把在它上面的所有Activty出栈,使之出于栈顶(不会创建新的实例),否则,创建一个新的实例入栈。
图四
eg: 如图一 此时如果在C中启动A,则BC会出栈,A就处于栈顶。
生命周期:同SingleTop 模式中的情况一同样。仅仅会又一次回调Activity中的 onNewIntent方法
四 singleInstance(独享栈)
全局单例模式,一个Activity占有一个完整的任务栈,意图启动这个Activity,如果任务栈存在,则复用,否则新建一个任务栈。
图五
五 onNewIntent 和configchanges
onNewIntent
通过上面启动模式的分析,我们知道,onNewIntent方法会在以下情况下调用:
- singleTop模式下意图启动的Activity正处于栈顶。
- singTask模式下意图启动的Activity存在于栈内。
- singleInstance模式下意图启动的Activity所在的任务栈存在。(该情况下无法通过setIntent传值)
configchanges
默认情况下,当系统配置发生变化时(屏幕旋转,系统导航栏变化,fontScale改变等等),Activity会被销毁重建。
eg:当我们在Manifest中配置
android:configChanges="orientation"
此时旋转屏幕Activity则不会重建,会回调onConfigurationinChanged方法。
网友评论