standard
和singleTop
的启动模式相对简单就不再说什么了,接下来主要是说singleTask
和singleInstance
。
之前对启动模式的了解大都是通过别人的博客,看了一些而且还转载了一些,博客确实写的图文并茂、绘声绘色,但毕竟是别人的东西,难免理解上会有偏差,所以再次读了一遍官方文档后,发现可能没有之前想的那么复杂,如下:
官方对于singleTask
和singleInstance
的定义是:
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
覆盖。