Android Activity的四种启动模式

最近刚好手头上没有任务,于是就来总结一下Android的知识点,温故而知新,可以为师矣嘛!虽然都比较基础,但有句老话说——好记性不如烂笔头,往往是基础的知识,得不到重视,更容易忘记!

设置Activity的启动模式

有两种方法来设置Activity的启动模式:
1.在AndroidManifest.xml的activity元素中设置launchMode属性,该方式为最常用方式:

1
2
3
<activity
...
android:launchMode="standard"/>

2.使用Java代码设置:

1
2
3
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

以上两种设置启动模式的方法还是有区别的,按照Android开发的惯例,Java代码的优先级肯定是高于xml代码的,如果两者同时存在的话,Java代码生效。另外在AndroidManifest.xml中无法设置FLAG_ACTIVITY_CLEAR_TOP标识,在Java代码中无法指定singleInstance模式。

四种启动模式
standard:标准模式

系统默认的模式,如果你没有设置启动模式的话默认这个模式。标准模式下的特点是每启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。被创建的Activity实例的生命周期正常调用,也就是onCreate、onStart、onResume都会被调用。
在这种模式下,当我们多次启动同一个Activity的时候,系统就会创建多个实例并把他们一一放到任务栈中。任务栈是一种后进先出的结构,每当我们按一下返回键的时候,就会有一个Activity出栈。

singleTop:栈顶复用模式

这种模式下,待启动的Activity如果位于任务栈的栈顶,那么就不会新建这个Activity的实例了。同时它的onNewIntent方法会被调用,我们可以在此方法取出当前请求信息。要注意的是,这个Activity的onCreate和onStart方法并不会被系统调用,因为它并没有发生改变。另外一种情况是,当这个Activity并不在任务栈的栈顶,这样的话新的Activity就会被以新实例的方式创建,onCreate、onStart、onResume都会被调用。

singleTask:栈内复用模式

这种模式下,相当于单例模式。单例模式相信大家都懂,单例模式就是要确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。Activity被创建出来,肯定需要一个任务栈,singleTask模式下启动此Activity首先需要判断有没有此Activity想要的任务栈,如果不存在就创建一个任务栈,并将此Activity压到栈中。如果任务栈已经存在,并且任务栈中也存在此Activity的实例,系统就会将此Activity调到栈顶,显示出来。也就是说,待启动的Activity在任务栈中如果已经存在,无论你启动多少次这个Activity都不会创建新的实例了,此时也会只调用onNewIntent方法。

singleInstance:单实例模式

这个模式可以理解为singleTask模式的加强版。此模式除了拥有singleTask模式所以的特性外,还有一点就是此模式的Activity只能单独的存在于一个任务栈中,由于栈内复用的特性,所以后续的请求均不会创建新的Activity实例了,除非这个任务栈被系统销毁了。