以前断断续续接触了解过Android activity,但是从没有应用过,此次由于一个严重缺陷再次认识Activity的启动模式,相比之前理解更深刻了,之后使用检查也就更方便了。.net
任务栈(Task Stack)
在Android中是使用任务(Task)来管理Activity的,任务就是存放在栈里面的Activity的集合,这个栈就是称为任务栈。blog
启动模式
Activity有4种启动模式:standard、singleTop、singleTask、singleInstance。内存
- standard:标准模式,这是系统默认的默认,也就是说你不设置Activity的launchMode时,默认的就是standard。在这种模式下,每次启动一个Activity都会从新建立一个新的实例,无论这个实例是否存在。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈,可是这是有条件的,前提是启动它的Activity不能是singleInstance,由于singleInstance只能独立于一个任务栈中,不能有其余的Activity实例。好比非singleInstance模式的Activity A启动了标准模式的Activity B,那么Activity B就会进入到Activity A所在的任务栈。
- singleTop:栈顶复用模式。在这种模式下,若是Activity已经在任务栈的栈顶了,当再次启动同一个Activity的时候,这个Activity不会被从新建立,并且它的onNewIntent()方法会被调用,可是它的onCreate()、onStart()方法不会被调用。此模式下的Activity也会进入启动它的非singleInstance模式的Activity所在的任务栈中。
- singleTask:栈内复用模式。在这种模式下,只要Activity存在栈内,那么屡次启动这个Activity都不会从新建立实例,系统会调用它的onNewIntent()方法。此外有个须要注意的地方:singleTask有clear top的效果,也就是说会将其以上的Activity所有出栈。
- singleInstance:这是singleTask的一种增强模式,除了singleTask全部特性之外,具备此模式的Activity只能单独位于一个任务栈中。
定义启动模式
使用manifest文件,在manifest文件中声明一个Activity的时候,能够指定这个Activity在启动的时候该如何与任务进行关联。it

我的中心菜单一开始设置的启动模式是singleTop,用户在我的中心中点击消息icon,费用查询等菜单来回跳转,多跳转几回平板就遇到OOM,内存不足。本质缘由就是:启动模式是singleTop致使页面无限堆叠,形成oom,后续改为singleTask就不存在此问题了,任什么时候候任何activity只建立一次,不会屡次。方法
总结
后续遇到菜单间跳转的,就能够先从启动模式查起,看下是否存在内存问题,从而作相应的处理。im
图解能够参考连接:https://blog.csdn.net/lucky_yan99/article/details/65627952总结