Activity的四种启动模式

为什么要用启动模式

因为在我们平时的开发项目中,一般都需要在本应用中多个Activity之间进行跳转,也就是说如果我们需要跳转到某一个原来的Activity实例的时候,我们肯定更希望的是这个Activity的实例它是被常用的,而不是再去重新创建一个新的Actiyvity。

可是Android的默认行为是当我们多次启动一个Activity的时候,系统它会创建多个Activity实例,然后把它按照创建的先后顺序放进任务栈当中,当我们按back键的时候,就会有一个Activity从任务栈的顶部移除,这样一直重复下去,直到我们的任务栈为空。

当任务栈为空的时候,系统就会回收这整个任务栈,但是这样以来,系统多次启动同一个Activity的时候,他就会重复的创建多个同样的Activity实例,这样的做法肯定是不合适的,所以我们必须要有一个方式去优化它,好在Android系统给我们四种启动模式,来修改系统这一默认的行为。

现在目前Activity的启动模式分为四种:

standard(标准模式)

singleTop(栈顶复用模式)

singleTask(栈内复用模式)

singleInstance(单实例模式)


standard--标准模式

standard标准模式

standard是系统默认的启动模式,可以不去指定任何的属性系统开启Activity就是标准化的,在这种模式下你每去启动一个Activity都会创建一个Activity的新的实例,然后将它放到任务栈的顶部,你不用去考虑这个实例是否存在,因为每次它都会开启一个新的Activity,就算栈中有重复的Activity他都不会去关心,仍旧会创建新的Activity的实例放在栈的顶部。

那么这种模式下谁启动了这种个模式的Activity,这个Activity就属于启动它的Activity任务栈当中,它的onCreate(),onStart(),onResume()方法每一次被启动的时候都会被依次调用。

singleTop--栈顶模式

singleTop栈顶复用

使用SingleTop启动模式启动一个Activity的时候,

当前栈中已有该Activity的实例并且该实例位于栈顶时,就不会去新建实例,而是去复用栈顶的那个Activity实例,并且会将Intent对象传入并回调onNewIntent()方法

当前栈中已有该Activity的实例但是该实例不在栈顶的时候或者是当前栈中不存在该Activity实例的时候,这两种情况就和stadard的标准模式一样,依然会重新创建一个新的Activity实例

应用场景:

1.IM对话框  ---如果你频繁收到很多条IM信息,不可能每弹出一次就去创建一个Activity,这样的话对系统来说是一个很大的负担,这个时候我们就可以通过SingleTop模式来开启这个Activity

2.新闻客户端推送 --- 如果你收到很多条新闻推送,每点一次那个push信息都会进入一个Activity,这个时候我们就可以通过SingleTop模式来复用这个Activity

注:不管是standard启动模式还是singleTop启动模式都是在原来的栈中开启一个Activity实例,是不会去新建一个任务栈的

SingleTask -- 栈内复用模式(也可以算做一种单例模式)

SingleTask 栈内复用模式

1.与SingleTop模式的区别

SingleTop检测的是栈顶元素是 否有需要启动的Activity,而SingleTask检测的是整个栈中是否存在需要启动的Activity,

如果存在就会直接将这个Activity放到栈顶,同时把这个Activity上面的Activity实例全部销毁,并回调onNewIntent()方法

2.特点

使用SingleTask启动模式启动一个Activity的时候,

首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈(一般情况下这个名字就是包名)  taskAffinity--任务相关性

如果不存在,则会创建一个新的Task,然后就会创建新的Activity实例加入到栈中

如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例,存在的话就会将存在这个Activity实例的上方所有Activity实例都出栈,然后回调启动Activity实例的onNewIntent()方法,不存在的话就会新建这个Activity实例然后入栈

3.应用场景---应用的主界面

SingleInstance -- 单实例模式

SingleInstance 单实例模式

1.特点

·SingleInstance模式启动的Activity具有全局唯一性(什么是全局唯一性?就是说在整个的系统当中,只会存在一个这样的实例)

·如果在启动这样的Activity时,已经存在了一个实例,就会把这个Activity实例调到前台,然后复用这个实例

·以SingleInstance模式启动的Acivity具有独占性(什么是独占性?就是说它会独自占有一个Task任务栈,而被他开启的任何一个Activity都只能运行在其他的任务栈当中,而他的任务栈只能有它这一个实例)

2.应用场景

1.呼叫来电 --- 比如说在你的应用界面当中突然接了个电话,这时候他就会跳到MainActivity

2.还有一种就是我们非常非常的确定,整个Activity只要有一个实例就可以完成相应的功能,这个时候就可以用SingleInstance模式,让别的应用也能打开这个SingleInstance模式下的Activity实例

你可能感兴趣的:(Activity的四种启动模式)