| ## 前言 |
|
在之前的activity介绍中我们理解了activity中的页面跳转、信息传递和生命周期,在这一章节,我们对activity的启动模式进行学习 |
|
| ## 1、了解任务栈 |
|
栈(stack)是非常常见的数据结构,就是有着后进先出的特性。 |
|
那么任务栈其实就是将我们的每一个activity当作一个元素进栈 |
|
| 一个最好懂的例子——拼夕夕APP,从“每日领现金”页面,点击跳转到“签到领红包”页面,再点击跳转到“帮忙砍一刀”页面,那么其中的任务栈就是如图 |
|
 |
|
| activity的不同启动模式,会导致activity在任务栈中的状态不一样,下面我会来一一介绍 |
|
| 首先需要知道的是,如何设置启动模式? |
|
| ## 2、如何设置启动模式? |
|
我们只需要在manifest.xml中的activity中进行android:launchMode=""的设置就可以了,例如我这里使用standard模式: |
|
| ```xml |
| <activity android:name=".study.test.CameraActivity" android:exported="true" |
| android:launchMode="standard"> |
|
|
|
|
|
| ``` |
|
| launchMode一共有如下几种,我们来一一介绍 |
|
 |
|
| ## 3、standard启动模式 |
|
最常见的模式,也是默认的启动模式。activity在这种启动模式下就和刚刚举的拼夕夕的例子一样,每一个新的activity都是任务栈中的新栈顶,而按下BACK键当前activity被销毁,任务栈中该activity执行出栈操作,被销毁! |
|
使用场景:绝大多场景默认使用 |
|
| 例子:(点击跳转到新生成的当前的activity,一共点击了3次,按下返回键4次回到主屏幕) |
|
 |
|
| ## 4、singleTop启动模式 |
|
| 看名字就知道,top,其实就是当前这个启动了带有这个启动模式的activity,那么就是在栈顶`了,如果当前activity在栈顶,无法被新的自己这个activity启动 |
|
使用场景:浏览器的书签、应用推送... |
|
| - 书签点击一次和点击多次,都是跳转到标记的地方,只会跳转一次 |
|
| - 同理,应用推送为了减少开销,每次点击不同的推送,都是确保仅开了一个进程存储在任务栈顶 |
|
| 例子:(已知点击新生成自己,未进行跳转,点击一次back就返回主屏幕) |
|
 |
|
| ## 5、singleTask启动模式 |
|
singleTask就是单一任务 |
|
| 具体例子: |
|
- activity A是 standard |
|
- activity B是 singleTask |
|
- 如果从A跳转到B之后,我们点击了很多个A或者其他activity,一旦跳转到B,B的上层栈空间全部被清除,B成为新栈顶。 |
- 这时再点击跳转到B自己,不会创建新的B,因为B已经在栈顶了 |
|
使用场景:当使用的activity占据的资源较大的时候,就使用singleTask模式 |
|
| ## 6、singleInstance启动模式 |
|
singleInstance是单例模式,创建的这个activity独占一个任务栈,并且每次跳回到这个activity都是让这个独占的任务栈放置在最前面,另一个任务栈在后面。如果调用非singleInstance的activity,那么独占的那个任务栈就会被置后。 |
|
singleInstance只会实例化一次,每次调用仅仅是让这个独占的任务栈提前。调用了其他的就会让这个任务栈置后。 |
|
| 使用场景:这个系统中只有唯一实例,比如说Launcher。或者词典类APP的取词功能,因为我们在每个界面都可以使用取词功能。 |
|
| ## 7、启动模式总结 |
|
|
|
|
|
|
|