Activity启动模式之SingleTask和SingleInstance

standardsingleTop的启动模式相对简单就不再说什么了,接下来主要是说singleTasksingleInstance

之前对启动模式的了解大都是通过别人的博客,看了一些而且还转载了一些,博客确实写的图文并茂、绘声绘色,但毕竟是别人的东西,难免理解上会有偏差,所以再次读了一遍官方文档后,发现可能没有之前想的那么复杂,如下:

官方对于singleTasksingleInstance的定义是:

singleTask:

被指定这个启动模式的Activity,系统创建它的时候会在一个新的task的底部实例化它。但是,如果这个Activity的实例已经存在于其他task中的话,系统会调用onNewIntent()方法并且找到task中已经存在的Activity实例。在同一时间只能存在一个Activity的实例。

要注意的是尽管Activity启动了一个新的task,但是用户点击后退键之后还是会回到之前的Activity

singleInstance:

这个启动模式和singleTask类似,但是不同的是,所有指定这个启动模式的Activity除了具有singleTask的特点之外还有就是每个task中只能存在一个Activity的实例,也就是说每个Activity的实例都是唯一的,而且每个task中有且只有一个Activity的实例。

对于上面两个启动模式,理解他们之前首先要理解task这个概念。官方文档上是这么说的:

一个task就是用户执行一项工作所用来交互的一些Activity的集合。这些Activity被一个栈来管理,(就是“back stack”),并以它们打开的顺序存放。

我理解的task就是一个存放Activity的栈,先进后出。
接下来继续看singleTask。我们用官方的图例来看:

图中x和y都在后台task中,y的启动模式设定为singleTask。前台的task里存放着1和2。当Activity2启动ActivityY的时候,由于y的启动模式为singleTask,所以系统会在已经存在的task中查找,这时候后台task就和前台task组合到一块,并且ActivityY这时候获取用户焦点。当用户点击后退键时Activity会从当前的task依次退出。

注意:在menifest中定义的启动模式会被代码中的intent flags覆盖。