Activity在启动的时候可以根据AndroidManifest清单文件中配置的android:launchMode属性来选择不同的加载模式。这四种模式分别是standard,singleTop,singTask和singleInstance。
研究启动模式之前首先了解一下Task:Android使用Task来管理多个Activity,当我们启动一个应用时,Android就为我们创建了一个Task,然后启动这个应用的入口Activity。Task是一个有点麻烦的概念,因为Android并没有为我们提供Task的api,开发者没法真正的去访问Task,我们只能通过调用Activity的getTaskID()方法来获取它所在的Task的ID。事实上我们可以把Task理解成Activity栈,Task以栈的形式来管理Activity:先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶。
- 只有栈顶的Activity才可以和用户进行交互
- 在关闭应用的时候,只有全部Activity都从Task中出栈,Task栈本身才可以销毁
- 并不一定一个应用的所有Activity都在同一个Task栈里,而不同应用调用的Activity则有可能在同一个栈里。
接下来开始Activity的研究启动模式。
Standard 模式
这是Activity默认的启动模式,使用这个加载模式可以不需要在AndroidManifest中显示的指定。每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中——这种模式不会启动新的Task,但也完全不考虑是否已经存在目标Activity,新Activity将被添加到原有的Task中。当按下back键时系统会逐一从Activity栈顶删除Activity实例。
singleTop 模式(Task内单例模式)
这种模式与Standard模式相似,不同之处在于:当将要被启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity实例,而是直接复用已有的Activity实例,这时目标Activity的onCreate()方法和onStart()方法都不会被调用,Activity的onNewIntent方法会被调用
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
SingleTask模式(Task内单例模式)
这种模式和singleTop模式有些相似,不同的地方在于singleTop只在Task栈顶有目标Activity的时候进行复用,而singleTask则是判断全栈中是否有目标Activity的实例,如果有并且在栈顶,那么和singleTop的行为相同;如果有但是不在栈顶,那么会把该Activity上面的所有Activity移出Task栈,从而使目标Activity来到栈顶,这时目标Activity的onCreate()方法和onStart()方法都不会被调用,Activity的onNewIntent方法会被调用;如果没有目标Activity的实例那么行为和standard和singleTop模式相同:创建目标Activity的实例并放入Task栈顶。
singleInstance 模式(全局单例模式)
这种加载模式下,系统保证无论从哪个Task中启动目标Activity,智慧创建一个Activity实例,并且使用一个全新的Task栈来装载该Activity实例,这个Task也只装载这一个Activity实例(独占)。
如果将要启动的Activity已经存在,无论它位于哪个应用中,无论位于哪个Task中,系统将会把该Activity所在的Task转到前台,从而是Activity显示出来。(这里涉及到前台Task与后台Task的问题了)