一、先来了解Task
Task 顾名思义,任务,每一个Android应用在运行的时候,都会创建和维护一个属于自己的任务,而事实上,Task是一个包含栈结构的容器,该栈通常叫回退栈,用来保存当前所有Android应用中已经创建的窗口对象,通常我们看到的界面就是处于回退栈栈顶的窗口对象。当我们打开新的一个界面,那么之前的界面(窗口对象)就会压入栈内,让出栈顶位置给新来的界面(窗口对象);当关闭该窗口对象时,系统会首先将该对象弹出栈,并销毁该对象。当栈里最后一个窗口对象被弹出栈后,回退栈为空,这时候回退栈被销毁,应用停止。(应该注意到,这时候,应用并没有完全退出内存,它的部分资源如静态变量还会在内存中停留很长时间。)
此外有一点需要注意的是,每一个应用都有一个独一无二的task,当打开新的一个应用时,它的task出现在前台,显示给用户,而旧的task将会转入后台,这时候系统会自动保存旧task窗口对象的状态,等该task被重新切换到前台运行后,该窗口回复焦点的同时也会恢复所有的状态,然而。必须指出一点,不要以为处于后台的task会一直停留在内存里,等待你回来。当手机内存被耗尽,或者新打开一个APP需要大量内存的时候,你所以为会等你的旧task将会无情地被系统干掉,哪个task被停止的时间越久越先被销毁。
二、四种启动模式launchMode
Activity有四种加载模式:
- standard
- singleTop
- singleTask
- singleInstance
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
模式 |
具体描述 |
standard |
launchMode的默认值,在新建Activity时默认不写,就已经是该模式,每调用一个startActivity,系统就会新实例化一个窗口对象,回退栈里就多一个该实例的窗口对象。除非是按back键或者在代码里调用finish()方法,否则一直存在直到应用停止。不管有没有已存在的实例,都生成新的实例。 |
singleTop |
如果窗口的实例刚好是在当前界面(即回退栈的栈顶),那么系统将不再创建新的窗口对象(standard模式则不同,不管是不是栈顶都会新建),直接使用该窗口实例。这样做的好处就是只要需要用的实例一直在界面上,回退栈里就只有一个实例,要退出时按下一次就能直接退出(因为只有一个窗口对象),这个模式在NFC中使用特别合适。 如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。但是,注意一点,它只看栈顶,不看栈里,如果栈顶没有该实例,栈里也有,它也依然会新建一个窗口对象的实例。
|
singleTask |
这个模式比较强权和霸道,即如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示在当前界面,而不会新建该实例。如果该窗口实例不存在则会新建,并置于栈顶。
|
singleInstance |
该模式更加独断专行,如果当前回退栈中有,则将它之前的实例对象全部清除出去,然后自己置于栈顶,如果当前回退栈没有,它会新建一个回退栈,然后新建一个实例对象,并且不允许其他实例对象进来。该模式很少用,因为新建一个只用于一个实例对象的回退栈太费内存空间。且意义不大。 |
上述文字比较枯燥,并且没有具体的例子。没写例子的原因是因为有前辈已经写了很详细的分析实例了。如果你还不太懂,请看这篇博文。http://blog.csdn.net/liuhe688/article/details/6754323
此外,上传一个专门用来讲述四种模式不同的例程。是《Android开发权威指南》里的一个例子,大家可以运行看看是不是这样。