彻底分清Activity的启动模式,明白什么情况下应该使用哪种模式

Activity的四种启动模式

Activity一共有四种启动模式,分别为standard、singleTop、singleTask、singleInstance。

这四种模式我们可以在AndroidManifest.xml清单文件的android:launchMode来进行配置

彻底分清Activity的启动模式,明白什么情况下应该使用哪种模式_第1张图片

Activity的任务栈

分析启动模式之前,需要清楚Activity的任务栈是什么意思。栈可以看成是一个队列,采用的是先入后出的原则,简单的可以把栈想象成一个可以压入子弹弹夹,每个任务栈相当于是一个弹夹,不同的任务栈也就是不同的弹夹,而任务栈中Activity就是弹夹里面的子弹,虽然Activity的任务栈中的Activity会因为有些启动模式可以从下面直接到上面,但完全可以这样简单粗暴的理解,任务栈是弹夹,Activity是弹夹中的子弹,当前活跃的那个Activity就好比弹夹中最上面的子弹。

四种启动模式的分析

一、standard模式

standard是默认的一种模式,当我们新创建一个应用或新声明一个Activity时,会发现其实并没有android:launchMode这个配置,此时这个Activity的启动模式就是standard,默认不配置跟android:launchMode="standard"效果一样。

这种模式下,启动它的activity所属的是哪个任务栈,它启动后就会默认进入哪个站,而且不管这个任务栈中之前有没有相同activity的实例,都会创建一个新的实例并压入栈中。activity它的onCreate(),onStart(),onResume()方法都会被调用。 

二、singleTop模式

singleTop是栈顶复用模式。启动singleTop模式的activity分为两种情况:

1.启动的activity不在栈顶时:和standard模式一致,不管栈中有没有相同activity的实例,都会创建都会创建一个新的实例并压入栈中,正常走生命周期的方法。

2.启动的activity在栈顶时:如果当前任务栈的栈顶为启动的activity,那么不会创建一个新的实例,跟singleTop模式的名字一样,会复用栈顶的实例,并且不会调用onCreate()和onStart(),而是会将Intent对象传入,调用onNewIntent()方法,之后调用onResume()方法。

三、singleTask模式

singleTask是栈内复用模式。如singleTop栈顶复用模式一样,singleTop是只有在新启动的实例在栈顶的时会复用,singleTask就是,只要新activity在所需要的任务栈中存在,不管它在栈中的什么位置,那么多次启动此activity都不会被重新创建单例,系统会回调onNewIntent()。

这种模式可以也称为单例模式,在所需要的任务栈中只会存在一个,栈中有则直接从栈中调用,栈中没有则新创建并且压入栈中。

但有几个情况需要特别注意,如果所需要的任务栈中存在这个Activity的实例,但此Activity并不位于栈顶,在复用时,并不是将此Activity直接移动到栈顶,而且将此Activity上面的Activity全部移出栈,从而达到这个Activity位于栈顶的目的。

而且singleTask模式的Activity启动时,还存在一个任务栈的匹配的过程,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。

四、singleInstance模式

singleInstance是单实例模式,具有全局唯一性。这种模式的activity只能单独地位于一个任务栈中,与singleTask有点类似,其实也是栈中有则直接复用,没有则创建并且放入栈中,只不过singleTask是可以和其他的Activity放在同一个栈中,singleInstance则是只会将创建的Activity放在一个栈中,并且这个栈中只会有这一个Activity实例,而且这种唯一性不单纯的限于单个App中,就算有两个应用启动同一个singleInstance模式的Activity,也是只会有一个实例,而且位于一个单独的栈中。

你可能感兴趣的:(Android面试,android知识问答篇,Activity启动模式,android,安卓,android,studio,java)