Activity的四种启动模式

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

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

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,也是只会有一个实例,而且位于一个单独的栈中。

更多相关文章

  1. Android(安卓)Wifi模块分析(三)
  2. Android系统配置数据库注释(settings.db)
  3. Android(安卓)Activity的启动
  4. Android(安卓)之 AsyncTask 异步任务
  5. Android(安卓)任务和回退堆栈---启动任务
  6. Android——Activity四种启动模式
  7. 修复Android(安卓)App在开机后入口类被启动两次的bug
  8. Android(安卓)后台任务(五)Service
  9. android 命令(adb shell)进入指定模拟器或设备

随机推荐

  1. Android(安卓)Studio Rendering Problems
  2. Android上的SQLLite性能分析
  3. android中Animation的使用!
  4. 画出 Android 的大体架构图
  5. Android APK 签名比对
  6. Android无障碍服务( Accessibility Servi
  7. OOM----内存溢出或内存泄漏
  8. Android设计缺陷--无法通话录音
  9. Android ListView工作原理完全解析,带你从
  10. 写在20110721:横竖屏切换