Activity启动模式有四种,分别是:
standard(默认模式)
singleTop(栈顶模式)
singleTask(栈内复用模式)
singleInstance(全局唯一模式)
在正式讲解之前我们先讲一下任务栈
什么是任务栈?
任务栈Task,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。
启动一个Application的时候,系统会为它默认创建一个对应的Task,用来放置根Activity。默认启动Activity会放在同一个Task中,新启动的Activity会被压入启动它的那个Activity的栈中,并且显示它。当用户按下回退键时,这个Activity就会被弹出栈,按下Home键回到桌面,再启动另一个应用,这时候之前那个Task就被移到后台,成为后台任务栈,而刚启动的那个Task就被调到前台,成为前台任务栈,Android系统显示的就是前台任务栈中的Top实例Activity。
任务栈的作用
栈是一个先进后出的线性表,根据Activity在当前栈结构中的位置,来决定该Activity的状态。正常情况下,当一个Activity启动了另一个Activity的时候,新启动的Activity就会置于任务栈的顶端,并处于活动状态,而启动它的Activity虽然成功身退,但依然保留在任务栈中,处于停止状态,当用户按下返回键或者调用finish()方法时,系统会移除顶部Activity,让后面的Activity恢复活动状态。当然,世界不可能一直这么“和谐”,可以给Activity设置一些“特权”,来打破这种“和谐”的模式,这种特权。这就是activity的启动模式
接下来我们一一讲解这四种模式
standard
standard模式是每次都会创建新的Activity对象,当点击返回按钮时,他会将栈顶(当前Activity)消灭,然后跳到下一层,不过此时在这个Activity中再次点击按钮创建对象时,它会另外创建新的Activity对象,这种模式可能大多数情况下不是我们需要的,因为对系统性能的消耗过大。
![](https://i-blog.csdnimg.cn/blog_migrate/39d7b2a3b31232f09d723f0200189274.webp?x-image-process=image/format,png)
singleTop
singleTop模式在每次启动的时候会检测栈顶是不是要启动的activity,如果是,则不创建新的activity;否则,创建新的activity
![](https://i-blog.csdnimg.cn/blog_migrate/39decd921be11df51854285c97e2ba6a.webp?x-image-process=image/format,png)
singleTask
singleTask模式在每次启动的时候检测栈中是否存在将要启动的activity,如果存在,则会让要启动的activity之上的元素出栈,销毁要启动的activity之上的activity;如果不存在,创建出新的activity
![](https://i-blog.csdnimg.cn/blog_migrate/be1ac19020e6f44405ff0ab005b3255f.webp?x-image-process=image/format,png)
singleInstance
singleInstance模式类似于浏览器,singleInstance模式在每次启动的时候会检测栈中是否存在将要启动的activity,如果存在,则将要启动的activity放到栈顶,确保至多有一个,与singleInstance不同的是,singleInstance模式不会销毁要启动的activity之上的activity。
![](https://i-blog.csdnimg.cn/blog_migrate/d41eb48b6e2a2441350e4d17d0bf50b2.webp?x-image-process=image/format,png)
如何配置Activity的启动模式?
1.在androidmainfest.xml中的activity节点中
<activity android:name=".MainActivity" android:launchMode="standard"/>
2.在intent的flag设置