建议先行阅读:
Android 面试黑洞——当我按下 Home 键再切回来,会发生什么?
一、任务和返回栈
1.概览
任务(Task)是Activity的合集,按应用分为不同的任务,点击应用列表是以任务为单位显示。
回退栈(Back Stack)是Activity的合集,也是任务的合集,表示了Activity的排序顺序,当用户按下返回时应该以什么顺序显示Activity。
二、启动模式
1.standard
![](https://img-blog.csdnimg.cn/104dbff251c04694873bac073d982ee0.png)
采用栈的存储结构,先进后出(FILO)。
提示:每一层都是Activity,不同颜色表示不同的应用。
2.singleTop
![](https://img-blog.csdnimg.cn/2f4375b0de044f1da9e181b4f5ccc3d7.png)
只有当栈顶和新加入的Activity相同时,才会复用,调用onNewIntent(Intent intent)。
3.singleTask
![](https://img-blog.csdnimg.cn/aa4ef0d8ad56434c9f9ac8397e673050.png)
当栈中有相同的Activity时,会把该Activity推到栈顶进行复用,清空其上方,调用onNewIntent()。
如上图,复用Activity2,把它推到栈顶,推出了Activity3。
![](https://img-blog.csdnimg.cn/3c12c66c7dce4b719c3c3ab16adeb1b9.png)
当调用其他Application的Activity时,如果其他Application的回退栈中存在该Activity,会把整个回退栈压到当前的回退栈之上,动画也是跨应用的动画。
![](https://img-blog.csdnimg.cn/ce0f8e2069d94494b8548582ce140789.png)
如果此时点击应用列表,他们会回到各自的应用。
![](https://img-blog.csdnimg.cn/d98ac17c1fea4f0eb5b8676972a799e0.gif)
4.singleInstance
独立一个Task出来专门用来复用,该Task不会显示在任务列表中。
![](https://img-blog.csdnimg.cn/1c5f6acec2b14abe8561279e0a036c70.png)
此图表示了从Activity1创建到Acitity4的过程。只用Activity3是singleInstance。
![](https://img-blog.csdnimg.cn/97d858383351470f89fa19e9e81f1362.gif)
此图描述了上述过程,并且从Activity4按下返回键是直接返回到Activity2,从Activity3按下返回也是Activity2。注意Activity3进场和退场的动画。
![](https://img-blog.csdnimg.cn/0ec3d063c5854c8a867de00d0b70711e.gif)
上述动作描述了当另外一个TestApplication调用MyApplication的Activity3时,MyApplication的Task压在了Activity3的独立Task之上,再下面是TestApplicaition的Task。